// Generated from ObjC.g4 by ANTLR 4.5.1
// jshint ignore: start
var antlr4 = require('./antlr4/index');
var ObjCListener = require('./ObjCListener').ObjCListener;
var grammarFileName = "ObjC.g4";

var serializedATN = ["\u0003\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd",
    "\u0003\u0091\u053a\u0004\u0002\t\u0002\u0004\u0003\t\u0003\u0004\u0004",
    "\t\u0004\u0004\u0005\t\u0005\u0004\u0006\t\u0006\u0004\u0007\t\u0007",
    "\u0004\b\t\b\u0004\t\t\t\u0004\n\t\n\u0004\u000b\t\u000b\u0004\f\t\f",
    "\u0004\r\t\r\u0004\u000e\t\u000e\u0004\u000f\t\u000f\u0004\u0010\t\u0010",
    "\u0004\u0011\t\u0011\u0004\u0012\t\u0012\u0004\u0013\t\u0013\u0004\u0014",
    "\t\u0014\u0004\u0015\t\u0015\u0004\u0016\t\u0016\u0004\u0017\t\u0017",
    "\u0004\u0018\t\u0018\u0004\u0019\t\u0019\u0004\u001a\t\u001a\u0004\u001b",
    "\t\u001b\u0004\u001c\t\u001c\u0004\u001d\t\u001d\u0004\u001e\t\u001e",
    "\u0004\u001f\t\u001f\u0004 \t \u0004!\t!\u0004\"\t\"\u0004#\t#\u0004",
    "$\t$\u0004%\t%\u0004&\t&\u0004\'\t\'\u0004(\t(\u0004)\t)\u0004*\t*\u0004",
    "+\t+\u0004,\t,\u0004-\t-\u0004.\t.\u0004/\t/\u00040\t0\u00041\t1\u0004",
    "2\t2\u00043\t3\u00044\t4\u00045\t5\u00046\t6\u00047\t7\u00048\t8\u0004",
    "9\t9\u0004:\t:\u0004;\t;\u0004<\t<\u0004=\t=\u0004>\t>\u0004?\t?\u0004",
    "@\t@\u0004A\tA\u0004B\tB\u0004C\tC\u0004D\tD\u0004E\tE\u0004F\tF\u0004",
    "G\tG\u0004H\tH\u0004I\tI\u0004J\tJ\u0004K\tK\u0004L\tL\u0004M\tM\u0004",
    "N\tN\u0004O\tO\u0004P\tP\u0004Q\tQ\u0004R\tR\u0004S\tS\u0004T\tT\u0004",
    "U\tU\u0004V\tV\u0004W\tW\u0004X\tX\u0004Y\tY\u0004Z\tZ\u0004[\t[\u0004",
    "\\\t\\\u0004]\t]\u0004^\t^\u0004_\t_\u0004`\t`\u0004a\ta\u0004b\tb\u0004",
    "c\tc\u0004d\td\u0004e\te\u0004f\tf\u0004g\tg\u0004h\th\u0004i\ti\u0004",
    "j\tj\u0004k\tk\u0004l\tl\u0004m\tm\u0004n\tn\u0004o\to\u0004p\tp\u0004",
    "q\tq\u0004r\tr\u0004s\ts\u0004t\tt\u0004u\tu\u0004v\tv\u0004w\tw\u0004",
    "x\tx\u0004y\ty\u0004z\tz\u0004{\t{\u0004|\t|\u0004}\t}\u0003\u0002\u0006",
    "\u0002\u00fc\n\u0002\r\u0002\u000e\u0002\u00fd\u0003\u0002\u0003\u0002",
    "\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003",
    "\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003",
    "\u0005\u0003\u010e\n\u0003\u0003\u0004\u0003\u0004\u0003\u0005\u0003",
    "\u0005\u0003\u0005\u0003\u0005\u0005\u0005\u0116\n\u0005\u0003\u0005",
    "\u0005\u0005\u0119\n\u0005\u0003\u0005\u0005\u0005\u011c\n\u0005\u0003",
    "\u0005\u0005\u0005\u011f\n\u0005\u0003\u0005\u0003\u0005\u0003\u0006",
    "\u0003\u0006\u0003\u0006\u0003\u0006\u0005\u0006\u0127\n\u0006\u0003",
    "\u0006\u0003\u0006\u0005\u0006\u012b\n\u0006\u0003\u0006\u0005\u0006",
    "\u012e\n\u0006\u0003\u0006\u0005\u0006\u0131\n\u0006\u0003\u0006\u0003",
    "\u0006\u0003\u0007\u0003\u0007\u0003\u0007\u0003\u0007\u0005\u0007\u0139",
    "\n\u0007\u0003\u0007\u0005\u0007\u013c\n\u0007\u0003\u0007\u0005\u0007",
    "\u013f\n\u0007\u0003\u0007\u0003\u0007\u0003\b\u0003\b\u0003\b\u0003",
    "\b\u0003\b\u0003\b\u0005\b\u0149\n\b\u0003\b\u0003\b\u0003\t\u0003\t",
    "\u0003\t\u0005\t\u0150\n\t\u0003\t\u0005\t\u0153\n\t\u0003\t\u0005\t",
    "\u0156\n\t\u0003\t\u0005\t\u0159\n\t\u0003\t\u0003\t\u0003\n\u0003\n",
    "\u0003\n\u0003\n\u0003\u000b\u0003\u000b\u0003\u000b\u0003\u000b\u0003",
    "\f\u0003\f\u0003\f\u0007\f\u0168\n\f\f\f\u000e\f\u016b\u000b\f\u0003",
    "\r\u0003\r\u0003\r\u0003\r\u0003\u000e\u0003\u000e\u0003\u000e\u0007",
    "\u000e\u0174\n\u000e\f\u000e\u000e\u000e\u0177\u000b\u000e\u0003\u000f",
    "\u0003\u000f\u0005\u000f\u017b\n\u000f\u0003\u000f\u0003\u000f\u0003",
    "\u0010\u0003\u0010\u0003\u0010\u0003\u0010\u0003\u0011\u0003\u0011\u0003",
    "\u0011\u0007\u0011\u0186\n\u0011\f\u0011\u000e\u0011\u0189\u000b\u0011",
    "\u0003\u0012\u0003\u0012\u0003\u0012\u0003\u0012\u0003\u0012\u0003\u0012",
    "\u0003\u0012\u0003\u0012\u0003\u0012\u0003\u0012\u0003\u0012\u0003\u0012",
    "\u0003\u0012\u0003\u0012\u0003\u0012\u0003\u0012\u0005\u0012\u019b\n",
    "\u0012\u0003\u0013\u0003\u0013\u0003\u0014\u0003\u0014\u0003\u0015\u0003",
    "\u0015\u0003\u0016\u0003\u0016\u0003\u0017\u0003\u0017\u0007\u0017\u01a7",
    "\n\u0017\f\u0017\u000e\u0017\u01aa\u000b\u0017\u0003\u0017\u0003\u0017",
    "\u0003\u0017\u0003\u0017\u0006\u0017\u01b0\n\u0017\r\u0017\u000e\u0017",
    "\u01b1\u0003\u0017\u0003\u0017\u0003\u0017\u0003\u0017\u0006\u0017\u01b8",
    "\n\u0017\r\u0017\u000e\u0017\u01b9\u0003\u0017\u0003\u0017\u0003\u0017",
    "\u0003\u0017\u0003\u0017\u0003\u0017\u0006\u0017\u01c2\n\u0017\r\u0017",
    "\u000e\u0017\u01c3\u0003\u0017\u0003\u0017\u0003\u0017\u0005\u0017\u01c9",
    "\n\u0017\u0003\u0018\u0003\u0018\u0003\u0019\u0003\u0019\u0003\u0019",
    "\u0003\u0019\u0006\u0019\u01d1\n\u0019\r\u0019\u000e\u0019\u01d2\u0003",
    "\u001a\u0003\u001a\u0003\u001a\u0003\u001b\u0003\u001b\u0003\u001b\u0003",
    "\u001c\u0005\u001c\u01dc\n\u001c\u0003\u001c\u0003\u001c\u0003\u001c",
    "\u0003\u001d\u0003\u001d\u0003\u001d\u0003\u001d\u0003\u001d\u0006\u001d",
    "\u01e6\n\u001d\r\u001d\u000e\u001d\u01e7\u0003\u001e\u0003\u001e\u0003",
    "\u001e\u0003\u001f\u0003\u001f\u0003\u001f\u0003 \u0005 \u01f1\n \u0003",
    " \u0003 \u0005 \u01f5\n \u0003 \u0005 \u01f8\n \u0003 \u0003 \u0003",
    "!\u0003!\u0006!\u01fe\n!\r!\u000e!\u01ff\u0003!\u0005!\u0203\n!\u0005",
    "!\u0205\n!\u0003\"\u0005\"\u0208\n\"\u0003\"\u0003\"\u0007\"\u020c\n",
    "\"\f\"\u000e\"\u020f\u000b\"\u0003\"\u0003\"\u0003#\u0003#\u0003$\u0003",
    "$\u0003$\u0003$\u0003%\u0003%\u0003%\u0003%\u0003%\u0003%\u0003%\u0003",
    "%\u0005%\u0221\n%\u0003&\u0003&\u0003&\u0007&\u0226\n&\f&\u000e&\u0229",
    "\u000b&\u0003\'\u0003\'\u0003\'\u0003\'\u0005\'\u022f\n\'\u0003(\u0003",
    "(\u0003(\u0003(\u0005(\u0235\n(\u0003(\u0003(\u0005(\u0239\n(\u0003",
    ")\u0003)\u0003)\u0003)\u0003)\u0003)\u0003)\u0003)\u0003)\u0003)\u0003",
    ")\u0005)\u0246\n)\u0003)\u0003)\u0005)\u024a\n)\u0003)\u0003)\u0003",
    ")\u0003)\u0003)\u0005)\u0251\n)\u0003*\u0003*\u0003*\u0005*\u0256\n",
    "*\u0003+\u0003+\u0003,\u0003,\u0003,\u0003,\u0003,\u0003,\u0003,\u0003",
    ",\u0003,\u0003,\u0003,\u0003,\u0003,\u0003,\u0003,\u0003,\u0003,\u0005",
    ",\u026b\n,\u0003-\u0003-\u0003-\u0003-\u0003.\u0003.\u0003.\u0005.\u0274",
    "\n.\u0003.\u0003.\u0007.\u0278\n.\f.\u000e.\u027b\u000b.\u0003.\u0005",
    ".\u027e\n.\u0003.\u0003.\u0003/\u0003/\u0003/\u0005/\u0285\n/\u0003",
    "/\u0003/\u0007/\u0289\n/\f/\u000e/\u028c\u000b/\u0003/\u0005/\u028f",
    "\n/\u0003/\u0003/\u00030\u00030\u00030\u00030\u00030\u00030\u00030\u0005",
    "0\u029a\n0\u00031\u00031\u00031\u00051\u029f\n1\u00031\u00031\u0007",
    "1\u02a3\n1\f1\u000e1\u02a6\u000b1\u00031\u00031\u00032\u00032\u0005",
    "2\u02ac\n2\u00032\u00052\u02af\n2\u00032\u00032\u00033\u00033\u0003",
    "3\u00033\u00033\u00034\u00034\u00034\u00054\u02bb\n4\u00035\u00035\u0006",
    "5\u02bf\n5\r5\u000e5\u02c0\u00055\u02c3\n5\u00036\u00056\u02c6\n6\u0003",
    "6\u00036\u00036\u00037\u00037\u00037\u00037\u00037\u00038\u00038\u0005",
    "8\u02d2\n8\u00038\u00068\u02d5\n8\r8\u000e8\u02d6\u00058\u02d9\n8\u0003",
    "9\u00039\u00039\u00039\u00039\u0003:\u0003:\u0003:\u0003:\u0003:\u0003",
    ";\u0003;\u0003;\u0003<\u0003<\u0003<\u0003=\u0003=\u0003=\u0003=\u0003",
    "=\u0003=\u0003>\u0003>\u0003>\u0003?\u0003?\u0003?\u0003?\u0003?\u0003",
    "@\u0003@\u0007@\u02fb\n@\f@\u000e@\u02fe\u000b@\u0003@\u0005@\u0301",
    "\n@\u0003A\u0003A\u0003A\u0003A\u0003A\u0003A\u0003B\u0003B\u0003B\u0003",
    "C\u0005C\u030d\nC\u0003C\u0003C\u0003C\u0003D\u0003D\u0005D\u0314\n",
    "D\u0003D\u0003D\u0003E\u0003E\u0003E\u0003E\u0006E\u031c\nE\rE\u000e",
    "E\u031d\u0003F\u0003F\u0003G\u0003G\u0003H\u0003H\u0003H\u0007H\u0327",
    "\nH\fH\u000eH\u032a\u000bH\u0003I\u0003I\u0003I\u0005I\u032f\nI\u0003",
    "J\u0003J\u0003J\u0005J\u0334\nJ\u0003J\u0003J\u0006J\u0338\nJ\rJ\u000e",
    "J\u0339\u0003J\u0003J\u0005J\u033e\nJ\u0003K\u0003K\u0003K\u0003K\u0003",
    "L\u0003L\u0003L\u0006L\u0347\nL\rL\u000eL\u0348\u0003M\u0003M\u0003",
    "M\u0007M\u034e\nM\fM\u000eM\u0351\u000bM\u0003N\u0003N\u0005N\u0355",
    "\nN\u0003N\u0003N\u0005N\u0359\nN\u0003O\u0003O\u0003O\u0005O\u035e",
    "\nO\u0003O\u0003O\u0003O\u0003O\u0003O\u0005O\u0365\nO\u0003O\u0003",
    "O\u0003O\u0003O\u0005O\u036b\nO\u0003O\u0003O\u0003O\u0003O\u0003O\u0003",
    "O\u0003O\u0003O\u0003O\u0003O\u0003O\u0003O\u0003O\u0003O\u0003O\u0003",
    "O\u0003O\u0003O\u0003O\u0003O\u0005O\u0381\nO\u0003P\u0003P\u0003P\u0007",
    "P\u0386\nP\fP\u000eP\u0389\u000bP\u0003P\u0005P\u038c\nP\u0003Q\u0003",
    "Q\u0003Q\u0005Q\u0391\nQ\u0003R\u0003R\u0005R\u0395\nR\u0003R\u0003",
    "R\u0005R\u0399\nR\u0003R\u0005R\u039c\nR\u0003S\u0005S\u039f\nS\u0003",
    "S\u0003S\u0003T\u0003T\u0007T\u03a5\nT\fT\u000eT\u03a8\u000bT\u0003",
    "T\u0003T\u0003T\u0003T\u0007T\u03ae\nT\fT\u000eT\u03b1\u000bT\u0003",
    "T\u0003T\u0003T\u0005T\u03b6\nT\u0003T\u0003T\u0005T\u03ba\nT\u0003",
    "U\u0003U\u0005U\u03be\nU\u0003U\u0003U\u0003U\u0005U\u03c3\nU\u0003",
    "U\u0005U\u03c6\nU\u0003V\u0003V\u0003V\u0005V\u03cb\nV\u0003W\u0003",
    "W\u0005W\u03cf\nW\u0003W\u0005W\u03d2\nW\u0003X\u0003X\u0003X\u0003",
    "X\u0003X\u0007X\u03d9\nX\fX\u000eX\u03dc\u000bX\u0003X\u0005X\u03df",
    "\nX\u0003X\u0003X\u0005X\u03e3\nX\u0003Y\u0003Y\u0003Y\u0003Y\u0005",
    "Y\u03e9\nY\u0003Z\u0003Z\u0003Z\u0003Z\u0003Z\u0003Z\u0003Z\u0006Z\u03f2",
    "\nZ\rZ\u000eZ\u03f3\u0003Z\u0003Z\u0005Z\u03f8\nZ\u0003Z\u0006Z\u03fb",
    "\nZ\rZ\u000eZ\u03fc\u0003Z\u0005Z\u0400\nZ\u0003[\u0003[\u0005[\u0404",
    "\n[\u0003[\u0003[\u0003[\u0005[\u0409\n[\u0003[\u0005[\u040c\n[\u0003",
    "\\\u0003\\\u0003\\\u0007\\\u0411\n\\\f\\\u000e\\\u0414\u000b\\\u0003",
    "]\u0006]\u0417\n]\r]\u000e]\u0418\u0003^\u0003^\u0003^\u0003^\u0003",
    "^\u0003^\u0003^\u0003^\u0003^\u0003^\u0003^\u0003^\u0005^\u0427\n^\u0003",
    "_\u0003_\u0003_\u0003_\u0003_\u0003_\u0003_\u0003_\u0003_\u0003_\u0003",
    "_\u0003_\u0005_\u0435\n_\u0003`\u0003`\u0003`\u0007`\u043a\n`\f`\u000e",
    "`\u043d\u000b`\u0003`\u0003`\u0003a\u0003a\u0003a\u0003a\u0003a\u0003",
    "a\u0003a\u0005a\u0448\na\u0003a\u0003a\u0003a\u0003a\u0003a\u0003a\u0005",
    "a\u0450\na\u0003b\u0003b\u0003b\u0003b\u0003b\u0005b\u0457\nb\u0003",
    "b\u0003b\u0003b\u0003c\u0003c\u0003c\u0003c\u0003c\u0003c\u0005c\u0462",
    "\nc\u0003c\u0003c\u0005c\u0466\nc\u0003c\u0003c\u0005c\u046a\nc\u0003",
    "c\u0003c\u0003c\u0003d\u0003d\u0003d\u0003d\u0003d\u0003d\u0003e\u0003",
    "e\u0003e\u0003e\u0003e\u0003e\u0003e\u0003e\u0003f\u0003f\u0003f\u0003",
    "f\u0005f\u0481\nf\u0003g\u0003g\u0003g\u0003g\u0003g\u0003g\u0003g\u0003",
    "g\u0003g\u0003g\u0005g\u048d\ng\u0003g\u0005g\u0490\ng\u0003h\u0003",
    "h\u0003h\u0007h\u0495\nh\fh\u000eh\u0498\u000bh\u0003i\u0003i\u0003",
    "i\u0003i\u0003i\u0005i\u049f\ni\u0003j\u0003j\u0003k\u0003k\u0003k\u0003",
    "k\u0003k\u0003k\u0005k\u04a9\nk\u0003l\u0003l\u0003m\u0003m\u0003m\u0007",
    "m\u04b0\nm\fm\u000em\u04b3\u000bm\u0003n\u0003n\u0003n\u0007n\u04b8",
    "\nn\fn\u000en\u04bb\u000bn\u0003o\u0003o\u0003o\u0007o\u04c0\no\fo\u000e",
    "o\u04c3\u000bo\u0003p\u0003p\u0003p\u0007p\u04c8\np\fp\u000ep\u04cb",
    "\u000bp\u0003q\u0003q\u0003q\u0007q\u04d0\nq\fq\u000eq\u04d3\u000bq",
    "\u0003r\u0003r\u0003r\u0007r\u04d8\nr\fr\u000er\u04db\u000br\u0003s",
    "\u0003s\u0003s\u0007s\u04e0\ns\fs\u000es\u04e3\u000bs\u0003t\u0003t",
    "\u0003t\u0007t\u04e8\nt\ft\u000et\u04eb\u000bt\u0003u\u0003u\u0003u",
    "\u0007u\u04f0\nu\fu\u000eu\u04f3\u000bu\u0003v\u0003v\u0003v\u0007v",
    "\u04f8\nv\fv\u000ev\u04fb\u000bv\u0003w\u0003w\u0003w\u0003w\u0003w",
    "\u0003w\u0005w\u0503\nw\u0003x\u0003x\u0003x\u0003x\u0003x\u0003x\u0003",
    "x\u0003x\u0003x\u0003x\u0003x\u0003x\u0003x\u0003x\u0005x\u0513\nx\u0005",
    "x\u0515\nx\u0003y\u0003y\u0003z\u0003z\u0003z\u0003z\u0003z\u0003z\u0003",
    "z\u0005z\u0520\nz\u0003z\u0003z\u0003z\u0003z\u0003z\u0003z\u0003z\u0007",
    "z\u0529\nz\fz\u000ez\u052c\u000bz\u0003{\u0003{\u0003{\u0007{\u0531",
    "\n{\f{\u000e{\u0534\u000b{\u0003|\u0003|\u0003}\u0003}\u0003}\u0002",
    "\u0002~\u0002\u0004\u0006\b\n\f\u000e\u0010\u0012\u0014\u0016\u0018",
    "\u001a\u001c\u001e \"$&(*,.02468:<>@BDFHJLNPRTVXZ\\^`bdfhjlnprtvxz|",
    "~\u0080\u0082\u0084\u0086\u0088\u008a\u008c\u008e\u0090\u0092\u0094",
    "\u0096\u0098\u009a\u009c\u009e\u00a0\u00a2\u00a4\u00a6\u00a8\u00aa\u00ac",
    "\u00ae\u00b0\u00b2\u00b4\u00b6\u00b8\u00ba\u00bc\u00be\u00c0\u00c2\u00c4",
    "\u00c6\u00c8\u00ca\u00cc\u00ce\u00d0\u00d2\u00d4\u00d6\u00d8\u00da\u00dc",
    "\u00de\u00e0\u00e2\u00e4\u00e6\u00e8\u00ea\u00ec\u00ee\u00f0\u00f2\u00f4",
    "\u00f6\u00f8\u0002\u0010\u0003\u0002\u0086\u0087\u0005\u0002\f\f\u000f",
    "\u000f\u0011\u0012\u0005\u0002\u001e\u001f./34\u0003\u0002EF\u0007\u0002",
    "\u001b\u001b))55::==\u0004\u0002;;>>\u0004\u0002RRkt\u0004\u0002YY\\",
    "\\\u0004\u0002STZ[\u0003\u0002ij\u0003\u0002ab\u0004\u0002cdhh\u0005",
    "\u0002UVbcee\u0004\u0002\u0080\u0080\u0082\u0085\u05a7\u0002\u00fb\u0003",
    "\u0002\u0002\u0002\u0004\u010d\u0003\u0002\u0002\u0002\u0006\u010f\u0003",
    "\u0002\u0002\u0002\b\u0111\u0003\u0002\u0002\u0002\n\u0122\u0003\u0002",
    "\u0002\u0002\f\u0134\u0003\u0002\u0002\u0002\u000e\u0142\u0003\u0002",
    "\u0002\u0002\u0010\u014c\u0003\u0002\u0002\u0002\u0012\u015c\u0003\u0002",
    "\u0002\u0002\u0014\u0160\u0003\u0002\u0002\u0002\u0016\u0164\u0003\u0002",
    "\u0002\u0002\u0018\u016c\u0003\u0002\u0002\u0002\u001a\u0170\u0003\u0002",
    "\u0002\u0002\u001c\u0178\u0003\u0002\u0002\u0002\u001e\u017e\u0003\u0002",
    "\u0002\u0002 \u0182\u0003\u0002\u0002\u0002\"\u019a\u0003\u0002\u0002",
    "\u0002$\u019c\u0003\u0002\u0002\u0002&\u019e\u0003\u0002\u0002\u0002",
    "(\u01a0\u0003\u0002\u0002\u0002*\u01a2\u0003\u0002\u0002\u0002,\u01c8",
    "\u0003\u0002\u0002\u0002.\u01ca\u0003\u0002\u0002\u00020\u01d0\u0003",
    "\u0002\u0002\u00022\u01d4\u0003\u0002\u0002\u00024\u01d7\u0003\u0002",
    "\u0002\u00026\u01db\u0003\u0002\u0002\u00028\u01e5\u0003\u0002\u0002",
    "\u0002:\u01e9\u0003\u0002\u0002\u0002<\u01ec\u0003\u0002\u0002\u0002",
    ">\u01f0\u0003\u0002\u0002\u0002@\u0204\u0003\u0002\u0002\u0002B\u0207",
    "\u0003\u0002\u0002\u0002D\u0212\u0003\u0002\u0002\u0002F\u0214\u0003",
    "\u0002\u0002\u0002H\u0220\u0003\u0002\u0002\u0002J\u0222\u0003\u0002",
    "\u0002\u0002L\u022e\u0003\u0002\u0002\u0002N\u0230\u0003\u0002\u0002",
    "\u0002P\u0250\u0003\u0002\u0002\u0002R\u0255\u0003\u0002\u0002\u0002",
    "T\u0257\u0003\u0002\u0002\u0002V\u026a\u0003\u0002\u0002\u0002X\u026c",
    "\u0003\u0002\u0002\u0002Z\u0270\u0003\u0002\u0002\u0002\\\u0281\u0003",
    "\u0002\u0002\u0002^\u0299\u0003\u0002\u0002\u0002`\u029b\u0003\u0002",
    "\u0002\u0002b\u02a9\u0003\u0002\u0002\u0002d\u02b2\u0003\u0002\u0002",
    "\u0002f\u02ba\u0003\u0002\u0002\u0002h\u02c2\u0003\u0002\u0002\u0002",
    "j\u02c5\u0003\u0002\u0002\u0002l\u02ca\u0003\u0002\u0002\u0002n\u02d8",
    "\u0003\u0002\u0002\u0002p\u02da\u0003\u0002\u0002\u0002r\u02df\u0003",
    "\u0002\u0002\u0002t\u02e4\u0003\u0002\u0002\u0002v\u02e7\u0003\u0002",
    "\u0002\u0002x\u02ea\u0003\u0002\u0002\u0002z\u02f0\u0003\u0002\u0002",
    "\u0002|\u02f3\u0003\u0002\u0002\u0002~\u02f8\u0003\u0002\u0002\u0002",
    "\u0080\u0302\u0003\u0002\u0002\u0002\u0082\u0308\u0003\u0002\u0002\u0002",
    "\u0084\u030c\u0003\u0002\u0002\u0002\u0086\u0311\u0003\u0002\u0002\u0002",
    "\u0088\u031b\u0003\u0002\u0002\u0002\u008a\u031f\u0003\u0002\u0002\u0002",
    "\u008c\u0321\u0003\u0002\u0002\u0002\u008e\u0323\u0003\u0002\u0002\u0002",
    "\u0090\u032b\u0003\u0002\u0002\u0002\u0092\u0330\u0003\u0002\u0002\u0002",
    "\u0094\u033f\u0003\u0002\u0002\u0002\u0096\u0346\u0003\u0002\u0002\u0002",
    "\u0098\u034a\u0003\u0002\u0002\u0002\u009a\u0358\u0003\u0002\u0002\u0002",
    "\u009c\u0380\u0003\u0002\u0002\u0002\u009e\u0382\u0003\u0002\u0002\u0002",
    "\u00a0\u038d\u0003\u0002\u0002\u0002\u00a2\u039b\u0003\u0002\u0002\u0002",
    "\u00a4\u039e\u0003\u0002\u0002\u0002\u00a6\u03b9\u0003\u0002\u0002\u0002",
    "\u00a8\u03c5\u0003\u0002\u0002\u0002\u00aa\u03c7\u0003\u0002\u0002\u0002",
    "\u00ac\u03cc\u0003\u0002\u0002\u0002\u00ae\u03e2\u0003\u0002\u0002\u0002",
    "\u00b0\u03e8\u0003\u0002\u0002\u0002\u00b2\u03ff\u0003\u0002\u0002\u0002",
    "\u00b4\u040b\u0003\u0002\u0002\u0002\u00b6\u040d\u0003\u0002\u0002\u0002",
    "\u00b8\u0416\u0003\u0002\u0002\u0002\u00ba\u0426\u0003\u0002\u0002\u0002",
    "\u00bc\u0434\u0003\u0002\u0002\u0002\u00be\u0436\u0003\u0002\u0002\u0002",
    "\u00c0\u044f\u0003\u0002\u0002\u0002\u00c2\u0451\u0003\u0002\u0002\u0002",
    "\u00c4\u045b\u0003\u0002\u0002\u0002\u00c6\u046e\u0003\u0002\u0002\u0002",
    "\u00c8\u0474\u0003\u0002\u0002\u0002\u00ca\u0480\u0003\u0002\u0002\u0002",
    "\u00cc\u048f\u0003\u0002\u0002\u0002\u00ce\u0491\u0003\u0002\u0002\u0002",
    "\u00d0\u049e\u0003\u0002\u0002\u0002\u00d2\u04a0\u0003\u0002\u0002\u0002",
    "\u00d4\u04a2\u0003\u0002\u0002\u0002\u00d6\u04aa\u0003\u0002\u0002\u0002",
    "\u00d8\u04ac\u0003\u0002\u0002\u0002\u00da\u04b4\u0003\u0002\u0002\u0002",
    "\u00dc\u04bc\u0003\u0002\u0002\u0002\u00de\u04c4\u0003\u0002\u0002\u0002",
    "\u00e0\u04cc\u0003\u0002\u0002\u0002\u00e2\u04d4\u0003\u0002\u0002\u0002",
    "\u00e4\u04dc\u0003\u0002\u0002\u0002\u00e6\u04e4\u0003\u0002\u0002\u0002",
    "\u00e8\u04ec\u0003\u0002\u0002\u0002\u00ea\u04f4\u0003\u0002\u0002\u0002",
    "\u00ec\u0502\u0003\u0002\u0002\u0002\u00ee\u0514\u0003\u0002\u0002\u0002",
    "\u00f0\u0516\u0003\u0002\u0002\u0002\u00f2\u0518\u0003\u0002\u0002\u0002",
    "\u00f4\u052d\u0003\u0002\u0002\u0002\u00f6\u0535\u0003\u0002\u0002\u0002",
    "\u00f8\u0537\u0003\u0002\u0002\u0002\u00fa\u00fc\u0005\u0004\u0003\u0002",
    "\u00fb\u00fa\u0003\u0002\u0002\u0002\u00fc\u00fd\u0003\u0002\u0002\u0002",
    "\u00fd\u00fb\u0003\u0002\u0002\u0002\u00fd\u00fe\u0003\u0002\u0002\u0002",
    "\u00fe\u00ff\u0003\u0002\u0002\u0002\u00ff\u0100\u0007\u0002\u0002\u0003",
    "\u0100\u0003\u0003\u0002\u0002\u0002\u0101\u010e\u0007\u008a\u0002\u0002",
    "\u0102\u010e\u0007\u008b\u0002\u0002\u0103\u010e\u0005\u0006\u0004\u0002",
    "\u0104\u010e\u0005\u0084C\u0002\u0105\u010e\u0005\u0086D\u0002\u0106",
    "\u010e\u0005\b\u0005\u0002\u0107\u010e\u0005\f\u0007\u0002\u0108\u010e",
    "\u0005\n\u0006\u0002\u0109\u010e\u0005\u000e\b\u0002\u010a\u010e\u0005",
    "\u0010\t\u0002\u010b\u010e\u0005\u0012\n\u0002\u010c\u010e\u0005\u0014",
    "\u000b\u0002\u010d\u0101\u0003\u0002\u0002\u0002\u010d\u0102\u0003\u0002",
    "\u0002\u0002\u010d\u0103\u0003\u0002\u0002\u0002\u010d\u0104\u0003\u0002",
    "\u0002\u0002\u010d\u0105\u0003\u0002\u0002\u0002\u010d\u0106\u0003\u0002",
    "\u0002\u0002\u010d\u0107\u0003\u0002\u0002\u0002\u010d\u0108\u0003\u0002",
    "\u0002\u0002\u010d\u0109\u0003\u0002\u0002\u0002\u010d\u010a\u0003\u0002",
    "\u0002\u0002\u010d\u010b\u0003\u0002\u0002\u0002\u010d\u010c\u0003\u0002",
    "\u0002\u0002\u010e\u0005\u0003\u0002\u0002\u0002\u010f\u0110\t\u0002",
    "\u0002\u0002\u0110\u0007\u0003\u0002\u0002\u0002\u0111\u0112\u0007\u000b",
    "\u0002\u0002\u0112\u0115\u0005$\u0013\u0002\u0113\u0114\u0007X\u0002",
    "\u0002\u0114\u0116\u0005&\u0014\u0002\u0115\u0113\u0003\u0002\u0002",
    "\u0002\u0115\u0116\u0003\u0002\u0002\u0002\u0116\u0118\u0003\u0002\u0002",
    "\u0002\u0117\u0119\u0005\u0018\r\u0002\u0118\u0117\u0003\u0002\u0002",
    "\u0002\u0118\u0119\u0003\u0002\u0002\u0002\u0119\u011b\u0003\u0002\u0002",
    "\u0002\u011a\u011c\u0005,\u0017\u0002\u011b\u011a\u0003\u0002\u0002",
    "\u0002\u011b\u011c\u0003\u0002\u0002\u0002\u011c\u011e\u0003\u0002\u0002",
    "\u0002\u011d\u011f\u00050\u0019\u0002\u011e\u011d\u0003\u0002\u0002",
    "\u0002\u011e\u011f\u0003\u0002\u0002\u0002\u011f\u0120\u0003\u0002\u0002",
    "\u0002\u0120\u0121\u0007\b\u0002\u0002\u0121\t\u0003\u0002\u0002\u0002",
    "\u0122\u0123\u0007\u000b\u0002\u0002\u0123\u0124\u0005$\u0013\u0002",
    "\u0124\u0126\u0007G\u0002\u0002\u0125\u0127\u0005(\u0015\u0002\u0126",
    "\u0125\u0003\u0002\u0002\u0002\u0126\u0127\u0003\u0002\u0002\u0002\u0127",
    "\u0128\u0003\u0002\u0002\u0002\u0128\u012a\u0007H\u0002\u0002\u0129",
    "\u012b\u0005\u0018\r\u0002\u012a\u0129\u0003\u0002\u0002\u0002\u012a",
    "\u012b\u0003\u0002\u0002\u0002\u012b\u012d\u0003\u0002\u0002\u0002\u012c",
    "\u012e\u0005,\u0017\u0002\u012d\u012c\u0003\u0002\u0002\u0002\u012d",
    "\u012e\u0003\u0002\u0002\u0002\u012e\u0130\u0003\u0002\u0002\u0002\u012f",
    "\u0131\u00050\u0019\u0002\u0130\u012f\u0003\u0002\u0002\u0002\u0130",
    "\u0131\u0003\u0002\u0002\u0002\u0131\u0132\u0003\u0002\u0002\u0002\u0132",
    "\u0133\u0007\b\u0002\u0002\u0133\u000b\u0003\u0002\u0002\u0002\u0134",
    "\u0135\u0007\n\u0002\u0002\u0135\u0138\u0005$\u0013\u0002\u0136\u0137",
    "\u0007X\u0002\u0002\u0137\u0139\u0005&\u0014\u0002\u0138\u0136\u0003",
    "\u0002\u0002\u0002\u0138\u0139\u0003\u0002\u0002\u0002\u0139\u013b\u0003",
    "\u0002\u0002\u0002\u013a\u013c\u0005,\u0017\u0002\u013b\u013a\u0003",
    "\u0002\u0002\u0002\u013b\u013c\u0003\u0002\u0002\u0002\u013c\u013e\u0003",
    "\u0002\u0002\u0002\u013d\u013f\u00058\u001d\u0002\u013e\u013d\u0003",
    "\u0002\u0002\u0002\u013e\u013f\u0003\u0002\u0002\u0002\u013f\u0140\u0003",
    "\u0002\u0002\u0002\u0140\u0141\u0007\b\u0002\u0002\u0141\r\u0003\u0002",
    "\u0002\u0002\u0142\u0143\u0007\n\u0002\u0002\u0143\u0144\u0005$\u0013",
    "\u0002\u0144\u0145\u0007G\u0002\u0002\u0145\u0146\u0005(\u0015\u0002",
    "\u0146\u0148\u0007H\u0002\u0002\u0147\u0149\u00058\u001d\u0002\u0148",
    "\u0147\u0003\u0002\u0002\u0002\u0148\u0149\u0003\u0002\u0002\u0002\u0149",
    "\u014a\u0003\u0002\u0002\u0002\u014a\u014b\u0007\b\u0002\u0002\u014b",
    "\u000f\u0003\u0002\u0002\u0002\u014c\u014d\u0007\r\u0002\u0002\u014d",
    "\u014f\u0005*\u0016\u0002\u014e\u0150\u0005\u0018\r\u0002\u014f\u014e",
    "\u0003\u0002\u0002\u0002\u014f\u0150\u0003\u0002\u0002\u0002\u0150\u0152",
    "\u0003\u0002\u0002\u0002\u0151\u0153\u00050\u0019\u0002\u0152\u0151",
    "\u0003\u0002\u0002\u0002\u0152\u0153\u0003\u0002\u0002\u0002\u0153\u0155",
    "\u0003\u0002\u0002\u0002\u0154\u0156\u0007\u000e\u0002\u0002\u0155\u0154",
    "\u0003\u0002\u0002\u0002\u0155\u0156\u0003\u0002\u0002\u0002\u0156\u0158",
    "\u0003\u0002\u0002\u0002\u0157\u0159\u00050\u0019\u0002\u0158\u0157",
    "\u0003\u0002\u0002\u0002\u0158\u0159\u0003\u0002\u0002\u0002\u0159\u015a",
    "\u0003\u0002\u0002\u0002\u015a\u015b\u0007\b\u0002\u0002\u015b\u0011",
    "\u0003\u0002\u0002\u0002\u015c\u015d\u0007\r\u0002\u0002\u015d\u015e",
    "\u0005\u001a\u000e\u0002\u015e\u015f\u0007M\u0002\u0002\u015f\u0013",
    "\u0003\u0002\u0002\u0002\u0160\u0161\u0007\u0005\u0002\u0002\u0161\u0162",
    "\u0005\u0016\f\u0002\u0162\u0163\u0007M\u0002\u0002\u0163\u0015\u0003",
    "\u0002\u0002\u0002\u0164\u0169\u0005$\u0013\u0002\u0165\u0166\u0007",
    "N\u0002\u0002\u0166\u0168\u0005$\u0013\u0002\u0167\u0165\u0003\u0002",
    "\u0002\u0002\u0168\u016b\u0003\u0002\u0002\u0002\u0169\u0167\u0003\u0002",
    "\u0002\u0002\u0169\u016a\u0003\u0002\u0002\u0002\u016a\u0017\u0003\u0002",
    "\u0002\u0002\u016b\u0169\u0003\u0002\u0002\u0002\u016c\u016d\u0007T",
    "\u0002\u0002\u016d\u016e\u0005\u001a\u000e\u0002\u016e\u016f\u0007S",
    "\u0002\u0002\u016f\u0019\u0003\u0002\u0002\u0002\u0170\u0175\u0005*",
    "\u0016\u0002\u0171\u0172\u0007N\u0002\u0002\u0172\u0174\u0005*\u0016",
    "\u0002\u0173\u0171\u0003\u0002\u0002\u0002\u0174\u0177\u0003\u0002\u0002",
    "\u0002\u0175\u0173\u0003\u0002\u0002\u0002\u0175\u0176\u0003\u0002\u0002",
    "\u0002\u0176\u001b\u0003\u0002\u0002\u0002\u0177\u0175\u0003\u0002\u0002",
    "\u0002\u0178\u017a\u0007\u0010\u0002\u0002\u0179\u017b\u0005\u001e\u0010",
    "\u0002\u017a\u0179\u0003\u0002\u0002\u0002\u017a\u017b\u0003\u0002\u0002",
    "\u0002\u017b\u017c\u0003\u0002\u0002\u0002\u017c\u017d\u0005\u0094K",
    "\u0002\u017d\u001d\u0003\u0002\u0002\u0002\u017e\u017f\u0007G\u0002",
    "\u0002\u017f\u0180\u0005 \u0011\u0002\u0180\u0181\u0007H\u0002\u0002",
    "\u0181\u001f\u0003\u0002\u0002\u0002\u0182\u0187\u0005\"\u0012\u0002",
    "\u0183\u0184\u0007N\u0002\u0002\u0184\u0186\u0005\"\u0012\u0002\u0185",
    "\u0183\u0003\u0002\u0002\u0002\u0186\u0189\u0003\u0002\u0002\u0002\u0187",
    "\u0185\u0003\u0002\u0002\u0002\u0187\u0188\u0003\u0002\u0002\u0002\u0188",
    "!\u0003\u0002\u0002\u0002\u0189\u0187\u0003\u0002\u0002\u0002\u018a",
    "\u019b\u0007x\u0002\u0002\u018b\u019b\u0007v\u0002\u0002\u018c\u019b",
    "\u0007~\u0002\u0002\u018d\u019b\u0007z\u0002\u0002\u018e\u019b\u0007",
    "{\u0002\u0002\u018f\u019b\u0007|\u0002\u0002\u0190\u019b\u0007}\u0002",
    "\u0002\u0191\u019b\u0003\u0002\u0002\u0002\u0192\u0193\u0007w\u0002",
    "\u0002\u0193\u0194\u0007R\u0002\u0002\u0194\u019b\u0007\u007f\u0002",
    "\u0002\u0195\u0196\u0007y\u0002\u0002\u0196\u0197\u0007R\u0002\u0002",
    "\u0197\u0198\u0007\u007f\u0002\u0002\u0198\u019b\u0007X\u0002\u0002",
    "\u0199\u019b\u0007\u007f\u0002\u0002\u019a\u018a\u0003\u0002\u0002\u0002",
    "\u019a\u018b\u0003\u0002\u0002\u0002\u019a\u018c\u0003\u0002\u0002\u0002",
    "\u019a\u018d\u0003\u0002\u0002\u0002\u019a\u018e\u0003\u0002\u0002\u0002",
    "\u019a\u018f\u0003\u0002\u0002\u0002\u019a\u0190\u0003\u0002\u0002\u0002",
    "\u019a\u0191\u0003\u0002\u0002\u0002\u019a\u0192\u0003\u0002\u0002\u0002",
    "\u019a\u0195\u0003\u0002\u0002\u0002\u019a\u0199\u0003\u0002\u0002\u0002",
    "\u019b#\u0003\u0002\u0002\u0002\u019c\u019d\u0007\u007f\u0002\u0002",
    "\u019d%\u0003\u0002\u0002\u0002\u019e\u019f\u0007\u007f\u0002\u0002",
    "\u019f\'\u0003\u0002\u0002\u0002\u01a0\u01a1\u0007\u007f\u0002\u0002",
    "\u01a1)\u0003\u0002\u0002\u0002\u01a2\u01a3\u0007\u007f\u0002\u0002",
    "\u01a3+\u0003\u0002\u0002\u0002\u01a4\u01a8\u0007I\u0002\u0002\u01a5",
    "\u01a7\u0005\u0094K\u0002\u01a6\u01a5\u0003\u0002\u0002\u0002\u01a7",
    "\u01aa\u0003\u0002\u0002\u0002\u01a8\u01a6\u0003\u0002\u0002\u0002\u01a8",
    "\u01a9\u0003\u0002\u0002\u0002\u01a9\u01ab\u0003\u0002\u0002\u0002\u01aa",
    "\u01a8\u0003\u0002\u0002\u0002\u01ab\u01c9\u0007J\u0002\u0002\u01ac",
    "\u01ad\u0007I\u0002\u0002\u01ad\u01af\u0005.\u0018\u0002\u01ae\u01b0",
    "\u0005\u0094K\u0002\u01af\u01ae\u0003\u0002\u0002\u0002\u01b0\u01b1",
    "\u0003\u0002\u0002\u0002\u01b1\u01af\u0003\u0002\u0002\u0002\u01b1\u01b2",
    "\u0003\u0002\u0002\u0002\u01b2\u01b3\u0003\u0002\u0002\u0002\u01b3\u01b4",
    "\u0007J\u0002\u0002\u01b4\u01c9\u0003\u0002\u0002\u0002\u01b5\u01b7",
    "\u0007I\u0002\u0002\u01b6\u01b8\u0005\u0094K\u0002\u01b7\u01b6\u0003",
    "\u0002\u0002\u0002\u01b8\u01b9\u0003\u0002\u0002\u0002\u01b9\u01b7\u0003",
    "\u0002\u0002\u0002\u01b9\u01ba\u0003\u0002\u0002\u0002\u01ba\u01bb\u0003",
    "\u0002\u0002\u0002\u01bb\u01bc\u0005,\u0017\u0002\u01bc\u01bd\u0007",
    "J\u0002\u0002\u01bd\u01c9\u0003\u0002\u0002\u0002\u01be\u01bf\u0007",
    "I\u0002\u0002\u01bf\u01c1\u0005.\u0018\u0002\u01c0\u01c2\u0005\u0094",
    "K\u0002\u01c1\u01c0\u0003\u0002\u0002\u0002\u01c2\u01c3\u0003\u0002",
    "\u0002\u0002\u01c3\u01c1\u0003\u0002\u0002\u0002\u01c3\u01c4\u0003\u0002",
    "\u0002\u0002\u01c4\u01c5\u0003\u0002\u0002\u0002\u01c5\u01c6\u0005,",
    "\u0017\u0002\u01c6\u01c7\u0007J\u0002\u0002\u01c7\u01c9\u0003\u0002",
    "\u0002\u0002\u01c8\u01a4\u0003\u0002\u0002\u0002\u01c8\u01ac\u0003\u0002",
    "\u0002\u0002\u01c8\u01b5\u0003\u0002\u0002\u0002\u01c8\u01be\u0003\u0002",
    "\u0002\u0002\u01c9-\u0003\u0002\u0002\u0002\u01ca\u01cb\t\u0003\u0002",
    "\u0002\u01cb/\u0003\u0002\u0002\u0002\u01cc\u01d1\u0005\u0086D\u0002",
    "\u01cd\u01d1\u00052\u001a\u0002\u01ce\u01d1\u00054\u001b\u0002\u01cf",
    "\u01d1\u0005\u001c\u000f\u0002\u01d0\u01cc\u0003\u0002\u0002\u0002\u01d0",
    "\u01cd\u0003\u0002\u0002\u0002\u01d0\u01ce\u0003\u0002\u0002\u0002\u01d0",
    "\u01cf\u0003\u0002\u0002\u0002\u01d1\u01d2\u0003\u0002\u0002\u0002\u01d2",
    "\u01d0\u0003\u0002\u0002\u0002\u01d2\u01d3\u0003\u0002\u0002\u0002\u01d3",
    "1\u0003\u0002\u0002\u0002\u01d4\u01d5\u0007a\u0002\u0002\u01d5\u01d6",
    "\u00056\u001c\u0002\u01d63\u0003\u0002\u0002\u0002\u01d7\u01d8\u0007",
    "b\u0002\u0002\u01d8\u01d9\u00056\u001c\u0002\u01d95\u0003\u0002\u0002",
    "\u0002\u01da\u01dc\u0005F$\u0002\u01db\u01da\u0003\u0002\u0002\u0002",
    "\u01db\u01dc\u0003\u0002\u0002\u0002\u01dc\u01dd\u0003\u0002\u0002\u0002",
    "\u01dd\u01de\u0005@!\u0002\u01de\u01df\u0007M\u0002\u0002\u01df7\u0003",
    "\u0002\u0002\u0002\u01e0\u01e6\u0005\u0084C\u0002\u01e1\u01e6\u0005",
    "\u0086D\u0002\u01e2\u01e6\u0005:\u001e\u0002\u01e3\u01e6\u0005<\u001f",
    "\u0002\u01e4\u01e6\u0005H%\u0002\u01e5\u01e0\u0003\u0002\u0002\u0002",
    "\u01e5\u01e1\u0003\u0002\u0002\u0002\u01e5\u01e2\u0003\u0002\u0002\u0002",
    "\u01e5\u01e3\u0003\u0002\u0002\u0002\u01e5\u01e4\u0003\u0002\u0002\u0002",
    "\u01e6\u01e7\u0003\u0002\u0002\u0002\u01e7\u01e5\u0003\u0002\u0002\u0002",
    "\u01e7\u01e8\u0003\u0002\u0002\u0002\u01e89\u0003\u0002\u0002\u0002",
    "\u01e9\u01ea\u0007a\u0002\u0002\u01ea\u01eb\u0005> \u0002\u01eb;\u0003",
    "\u0002\u0002\u0002\u01ec\u01ed\u0007b\u0002\u0002\u01ed\u01ee\u0005",
    "> \u0002\u01ee=\u0003\u0002\u0002\u0002\u01ef\u01f1\u0005F$\u0002\u01f0",
    "\u01ef\u0003\u0002\u0002\u0002\u01f0\u01f1\u0003\u0002\u0002\u0002\u01f1",
    "\u01f2\u0003\u0002\u0002\u0002\u01f2\u01f4\u0005@!\u0002\u01f3\u01f5",
    "\u0005\u008eH\u0002\u01f4\u01f3\u0003\u0002\u0002\u0002\u01f4\u01f5",
    "\u0003\u0002\u0002\u0002\u01f5\u01f7\u0003\u0002\u0002\u0002\u01f6\u01f8",
    "\u0007M\u0002\u0002\u01f7\u01f6\u0003\u0002\u0002\u0002\u01f7\u01f8",
    "\u0003\u0002\u0002\u0002\u01f8\u01f9\u0003\u0002\u0002\u0002\u01f9\u01fa",
    "\u0005\u00be`\u0002\u01fa?\u0003\u0002\u0002\u0002\u01fb\u0205\u0005",
    "D#\u0002\u01fc\u01fe\u0005B\"\u0002\u01fd\u01fc\u0003\u0002\u0002\u0002",
    "\u01fe\u01ff\u0003\u0002\u0002\u0002\u01ff\u01fd\u0003\u0002\u0002\u0002",
    "\u01ff\u0200\u0003\u0002\u0002\u0002\u0200\u0202\u0003\u0002\u0002\u0002",
    "\u0201\u0203\u0005\u00aaV\u0002\u0202\u0201\u0003\u0002\u0002\u0002",
    "\u0202\u0203\u0003\u0002\u0002\u0002\u0203\u0205\u0003\u0002\u0002\u0002",
    "\u0204\u01fb\u0003\u0002\u0002\u0002\u0204\u01fd\u0003\u0002\u0002\u0002",
    "\u0205A\u0003\u0002\u0002\u0002\u0206\u0208\u0005D#\u0002\u0207\u0206",
    "\u0003\u0002\u0002\u0002\u0207\u0208\u0003\u0002\u0002\u0002\u0208\u0209",
    "\u0003\u0002\u0002\u0002\u0209\u020d\u0007X\u0002\u0002\u020a\u020c",
    "\u0005F$\u0002\u020b\u020a\u0003\u0002\u0002\u0002\u020c\u020f\u0003",
    "\u0002\u0002\u0002\u020d\u020b\u0003\u0002\u0002\u0002\u020d\u020e\u0003",
    "\u0002\u0002\u0002\u020e\u0210\u0003\u0002\u0002\u0002\u020f\u020d\u0003",
    "\u0002\u0002\u0002\u0210\u0211\u0007\u007f\u0002\u0002\u0211C\u0003",
    "\u0002\u0002\u0002\u0212\u0213\u0007\u007f\u0002\u0002\u0213E\u0003",
    "\u0002\u0002\u0002\u0214\u0215\u0007G\u0002\u0002\u0215\u0216\u0005",
    "\u00b0Y\u0002\u0216\u0217\u0007H\u0002\u0002\u0217G\u0003\u0002\u0002",
    "\u0002\u0218\u0219\u0007\u0015\u0002\u0002\u0219\u021a\u0005J&\u0002",
    "\u021a\u021b\u0007M\u0002\u0002\u021b\u0221\u0003\u0002\u0002\u0002",
    "\u021c\u021d\u0007\u0006\u0002\u0002\u021d\u021e\u0005J&\u0002\u021e",
    "\u021f\u0007M\u0002\u0002\u021f\u0221\u0003\u0002\u0002\u0002\u0220",
    "\u0218\u0003\u0002\u0002\u0002\u0220\u021c\u0003\u0002\u0002\u0002\u0221",
    "I\u0003\u0002\u0002\u0002\u0222\u0227\u0005L\'\u0002\u0223\u0224\u0007",
    "N\u0002\u0002\u0224\u0226\u0005L\'\u0002\u0225\u0223\u0003\u0002\u0002",
    "\u0002\u0226\u0229\u0003\u0002\u0002\u0002\u0227\u0225\u0003\u0002\u0002",
    "\u0002\u0227\u0228\u0003\u0002\u0002\u0002\u0228K\u0003\u0002\u0002",
    "\u0002\u0229\u0227\u0003\u0002\u0002\u0002\u022a\u022f\u0007\u007f\u0002",
    "\u0002\u022b\u022c\u0007\u007f\u0002\u0002\u022c\u022d\u0007R\u0002",
    "\u0002\u022d\u022f\u0007\u007f\u0002\u0002\u022e\u022a\u0003\u0002\u0002",
    "\u0002\u022e\u022b\u0003\u0002\u0002\u0002\u022fM\u0003\u0002\u0002",
    "\u0002\u0230\u0231\u0005P)\u0002\u0231\u0232\u0007G\u0002\u0002\u0232",
    "\u0234\u0007g\u0002\u0002\u0233\u0235\u0005P)\u0002\u0234\u0233\u0003",
    "\u0002\u0002\u0002\u0234\u0235\u0003\u0002\u0002\u0002\u0235\u0236\u0003",
    "\u0002\u0002\u0002\u0236\u0238\u0007H\u0002\u0002\u0237\u0239\u0005",
    "`1\u0002\u0238\u0237\u0003\u0002\u0002\u0002\u0238\u0239\u0003\u0002",
    "\u0002\u0002\u0239O\u0003\u0002\u0002\u0002\u023a\u0251\u0007@\u0002",
    "\u0002\u023b\u0251\u0007!\u0002\u0002\u023c\u0251\u00077\u0002\u0002",
    "\u023d\u0251\u00071\u0002\u0002\u023e\u0251\u00072\u0002\u0002\u023f",
    "\u0251\u0007*\u0002\u0002\u0240\u0251\u0007&\u0002\u0002\u0241\u0251",
    "\u00078\u0002\u0002\u0242\u0251\u0007?\u0002\u0002\u0243\u0245\u0007",
    ",\u0002\u0002\u0244\u0246\u0005\u0018\r\u0002\u0245\u0244\u0003\u0002",
    "\u0002\u0002\u0245\u0246\u0003\u0002\u0002\u0002\u0246\u0251\u0003\u0002",
    "\u0002\u0002\u0247\u0249\u0005$\u0013\u0002\u0248\u024a\u0005\u0018",
    "\r\u0002\u0249\u0248\u0003\u0002\u0002\u0002\u0249\u024a\u0003\u0002",
    "\u0002\u0002\u024a\u0251\u0003\u0002\u0002\u0002\u024b\u0251\u0005\u0092",
    "J\u0002\u024c\u0251\u0005\u009cO\u0002\u024d\u0251\u0007\u007f\u0002",
    "\u0002\u024e\u024f\u0007\u007f\u0002\u0002\u024f\u0251\u0005\u00a2R",
    "\u0002\u0250\u023a\u0003\u0002\u0002\u0002\u0250\u023b\u0003\u0002\u0002",
    "\u0002\u0250\u023c\u0003\u0002\u0002\u0002\u0250\u023d\u0003\u0002\u0002",
    "\u0002\u0250\u023e\u0003\u0002\u0002\u0002\u0250\u023f\u0003\u0002\u0002",
    "\u0002\u0250\u0240\u0003\u0002\u0002\u0002\u0250\u0241\u0003\u0002\u0002",
    "\u0002\u0250\u0242\u0003\u0002\u0002\u0002\u0250\u0243\u0003\u0002\u0002",
    "\u0002\u0250\u0247\u0003\u0002\u0002\u0002\u0250\u024b\u0003\u0002\u0002",
    "\u0002\u0250\u024c\u0003\u0002\u0002\u0002\u0250\u024d\u0003\u0002\u0002",
    "\u0002\u0250\u024e\u0003\u0002\u0002\u0002\u0251Q\u0003\u0002\u0002",
    "\u0002\u0252\u0256\u0007\"\u0002\u0002\u0253\u0256\u0007A\u0002\u0002",
    "\u0254\u0256\u0005T+\u0002\u0255\u0252\u0003\u0002\u0002\u0002\u0255",
    "\u0253\u0003\u0002\u0002\u0002\u0255\u0254\u0003\u0002\u0002\u0002\u0256",
    "S\u0003\u0002\u0002\u0002\u0257\u0258\t\u0004\u0002\u0002\u0258U\u0003",
    "\u0002\u0002\u0002\u0259\u026b\u0007\u007f\u0002\u0002\u025a\u026b\u0005",
    "\u00f8}\u0002\u025b\u026b\u0007\u0081\u0002\u0002\u025c\u025d\u0007",
    "G\u0002\u0002\u025d\u025e\u0005\u00ceh\u0002\u025e\u025f\u0007H\u0002",
    "\u0002\u025f\u026b\u0003\u0002\u0002\u0002\u0260\u026b\u0007\u0019\u0002",
    "\u0002\u0261\u026b\u0007\u0018\u0002\u0002\u0262\u026b\u0005d3\u0002",
    "\u0263\u026b\u0005l7\u0002\u0264\u026b\u0005p9\u0002\u0265\u026b\u0005",
    "r:\u0002\u0266\u026b\u0005Z.\u0002\u0267\u026b\u0005\\/\u0002\u0268",
    "\u026b\u0005^0\u0002\u0269\u026b\u0005b2\u0002\u026a\u0259\u0003\u0002",
    "\u0002\u0002\u026a\u025a\u0003\u0002\u0002\u0002\u026a\u025b\u0003\u0002",
    "\u0002\u0002\u026a\u025c\u0003\u0002\u0002\u0002\u026a\u0260\u0003\u0002",
    "\u0002\u0002\u026a\u0261\u0003\u0002\u0002\u0002\u026a\u0262\u0003\u0002",
    "\u0002\u0002\u026a\u0263\u0003\u0002\u0002\u0002\u026a\u0264\u0003\u0002",
    "\u0002\u0002\u026a\u0265\u0003\u0002\u0002\u0002\u026a\u0266\u0003\u0002",
    "\u0002\u0002\u026a\u0267\u0003\u0002\u0002\u0002\u026a\u0268\u0003\u0002",
    "\u0002\u0002\u026a\u0269\u0003\u0002\u0002\u0002\u026bW\u0003\u0002",
    "\u0002\u0002\u026c\u026d\u0005\u00f2z\u0002\u026d\u026e\u0007X\u0002",
    "\u0002\u026e\u026f\u0005\u00f2z\u0002\u026fY\u0003\u0002\u0002\u0002",
    "\u0270\u0271\u0007Q\u0002\u0002\u0271\u0273\u0007I\u0002\u0002\u0272",
    "\u0274\u0005X-\u0002\u0273\u0272\u0003\u0002\u0002\u0002\u0273\u0274",
    "\u0003\u0002\u0002\u0002\u0274\u0279\u0003\u0002\u0002\u0002\u0275\u0276",
    "\u0007N\u0002\u0002\u0276\u0278\u0005X-\u0002\u0277\u0275\u0003\u0002",
    "\u0002\u0002\u0278\u027b\u0003\u0002\u0002\u0002\u0279\u0277\u0003\u0002",
    "\u0002\u0002\u0279\u027a\u0003\u0002\u0002\u0002\u027a\u027d\u0003\u0002",
    "\u0002\u0002\u027b\u0279\u0003\u0002\u0002\u0002\u027c\u027e\u0007N",
    "\u0002\u0002\u027d\u027c\u0003\u0002\u0002\u0002\u027d\u027e\u0003\u0002",
    "\u0002\u0002\u027e\u027f\u0003\u0002\u0002\u0002\u027f\u0280\u0007J",
    "\u0002\u0002\u0280[\u0003\u0002\u0002\u0002\u0281\u0282\u0007Q\u0002",
    "\u0002\u0282\u0284\u0007K\u0002\u0002\u0283\u0285\u0005\u00f2z\u0002",
    "\u0284\u0283\u0003\u0002\u0002\u0002\u0284\u0285\u0003\u0002\u0002\u0002",
    "\u0285\u028a\u0003\u0002\u0002\u0002\u0286\u0287\u0007N\u0002\u0002",
    "\u0287\u0289\u0005\u00f2z\u0002\u0288\u0286\u0003\u0002\u0002\u0002",
    "\u0289\u028c\u0003\u0002\u0002\u0002\u028a\u0288\u0003\u0002\u0002\u0002",
    "\u028a\u028b\u0003\u0002\u0002\u0002\u028b\u028e\u0003\u0002\u0002\u0002",
    "\u028c\u028a\u0003\u0002\u0002\u0002\u028d\u028f\u0007N\u0002\u0002",
    "\u028e\u028d\u0003\u0002\u0002\u0002\u028e\u028f\u0003\u0002\u0002\u0002",
    "\u028f\u0290\u0003\u0002\u0002\u0002\u0290\u0291\u0007L\u0002\u0002",
    "\u0291]\u0003\u0002\u0002\u0002\u0292\u0293\u0007Q\u0002\u0002\u0293",
    "\u0294\u0007G\u0002\u0002\u0294\u0295\u0005\u00f2z\u0002\u0295\u0296",
    "\u0007H\u0002\u0002\u0296\u029a\u0003\u0002\u0002\u0002\u0297\u0298",
    "\u0007Q\u0002\u0002\u0298\u029a\u0005\u00f8}\u0002\u0299\u0292\u0003",
    "\u0002\u0002\u0002\u0299\u0297\u0003\u0002\u0002\u0002\u029a_\u0003",
    "\u0002\u0002\u0002\u029b\u029e\u0007G\u0002\u0002\u029c\u029f\u0005",
    "t;\u0002\u029d\u029f\u0007@\u0002\u0002\u029e\u029c\u0003\u0002\u0002",
    "\u0002\u029e\u029d\u0003\u0002\u0002\u0002\u029e\u029f\u0003\u0002\u0002",
    "\u0002\u029f\u02a4\u0003\u0002\u0002\u0002\u02a0\u02a1\u0007N\u0002",
    "\u0002\u02a1\u02a3\u0005t;\u0002\u02a2\u02a0\u0003\u0002\u0002\u0002",
    "\u02a3\u02a6\u0003\u0002\u0002\u0002\u02a4\u02a2\u0003\u0002\u0002\u0002",
    "\u02a4\u02a5\u0003\u0002\u0002\u0002\u02a5\u02a7\u0003\u0002\u0002\u0002",
    "\u02a6\u02a4\u0003\u0002\u0002\u0002\u02a7\u02a8\u0007H\u0002\u0002",
    "\u02a8a\u0003\u0002\u0002\u0002\u02a9\u02ab\u0007g\u0002\u0002\u02aa",
    "\u02ac\u0005P)\u0002\u02ab\u02aa\u0003\u0002\u0002\u0002\u02ab\u02ac",
    "\u0003\u0002\u0002\u0002\u02ac\u02ae\u0003\u0002\u0002\u0002\u02ad\u02af",
    "\u0005`1\u0002\u02ae\u02ad\u0003\u0002\u0002\u0002\u02ae\u02af\u0003",
    "\u0002\u0002\u0002\u02af\u02b0\u0003\u0002\u0002\u0002\u02b0\u02b1\u0005",
    "\u00be`\u0002\u02b1c\u0003\u0002\u0002\u0002\u02b2\u02b3\u0007K\u0002",
    "\u0002\u02b3\u02b4\u0005f4\u0002\u02b4\u02b5\u0005h5\u0002\u02b5\u02b6",
    "\u0007L\u0002\u0002\u02b6e\u0003\u0002\u0002\u0002\u02b7\u02bb\u0005",
    "\u00ceh\u0002\u02b8\u02bb\u0005$\u0013\u0002\u02b9\u02bb\u0007\u0018",
    "\u0002\u0002\u02ba\u02b7\u0003\u0002\u0002\u0002\u02ba\u02b8\u0003\u0002",
    "\u0002\u0002\u02ba\u02b9\u0003\u0002\u0002\u0002\u02bbg\u0003\u0002",
    "\u0002\u0002\u02bc\u02c3\u0005D#\u0002\u02bd\u02bf\u0005j6\u0002\u02be",
    "\u02bd\u0003\u0002\u0002\u0002\u02bf\u02c0\u0003\u0002\u0002\u0002\u02c0",
    "\u02be\u0003\u0002\u0002\u0002\u02c0\u02c1\u0003\u0002\u0002\u0002\u02c1",
    "\u02c3\u0003\u0002\u0002\u0002\u02c2\u02bc\u0003\u0002\u0002\u0002\u02c2",
    "\u02be\u0003\u0002\u0002\u0002\u02c3i\u0003\u0002\u0002\u0002\u02c4",
    "\u02c6\u0005D#\u0002\u02c5\u02c4\u0003\u0002\u0002\u0002\u02c5\u02c6",
    "\u0003\u0002\u0002\u0002\u02c6\u02c7\u0003\u0002\u0002\u0002\u02c7\u02c8",
    "\u0007X\u0002\u0002\u02c8\u02c9\u0005\u00ceh\u0002\u02c9k\u0003\u0002",
    "\u0002\u0002\u02ca\u02cb\u0007\u0013\u0002\u0002\u02cb\u02cc\u0007G",
    "\u0002\u0002\u02cc\u02cd\u0005n8\u0002\u02cd\u02ce\u0007H\u0002\u0002",
    "\u02cem\u0003\u0002\u0002\u0002\u02cf\u02d9\u0005D#\u0002\u02d0\u02d2",
    "\u0005D#\u0002\u02d1\u02d0\u0003\u0002\u0002\u0002\u02d1\u02d2\u0003",
    "\u0002\u0002\u0002\u02d2\u02d3\u0003\u0002\u0002\u0002\u02d3\u02d5\u0007",
    "X\u0002\u0002\u02d4\u02d1\u0003\u0002\u0002\u0002\u02d5\u02d6\u0003",
    "\u0002\u0002\u0002\u02d6\u02d4\u0003\u0002\u0002\u0002\u02d6\u02d7\u0003",
    "\u0002\u0002\u0002\u02d7\u02d9\u0003\u0002\u0002\u0002\u02d8\u02cf\u0003",
    "\u0002\u0002\u0002\u02d8\u02d4\u0003\u0002\u0002\u0002\u02d9o\u0003",
    "\u0002\u0002\u0002\u02da\u02db\u0007\r\u0002\u0002\u02db\u02dc\u0007",
    "G\u0002\u0002\u02dc\u02dd\u0005*\u0016\u0002\u02dd\u02de\u0007H\u0002",
    "\u0002\u02deq\u0003\u0002\u0002\u0002\u02df\u02e0\u0007\u0007\u0002",
    "\u0002\u02e0\u02e1\u0007G\u0002\u0002\u02e1\u02e2\u0005\u00b0Y\u0002",
    "\u02e2\u02e3\u0007H\u0002\u0002\u02e3s\u0003\u0002\u0002\u0002\u02e4",
    "\u02e5\u0005\u0088E\u0002\u02e5\u02e6\u0005\u00a4S\u0002\u02e6u\u0003",
    "\u0002\u0002\u0002\u02e7\u02e8\u0007\u0017\u0002\u0002\u02e8\u02e9\u0005",
    "\u00be`\u0002\u02e9w\u0003\u0002\u0002\u0002\u02ea\u02eb\u0007\u0004",
    "\u0002\u0002\u02eb\u02ec\u0007G\u0002\u0002\u02ec\u02ed\u0005t;\u0002",
    "\u02ed\u02ee\u0007H\u0002\u0002\u02ee\u02ef\u0005\u00be`\u0002\u02ef",
    "y\u0003\u0002\u0002\u0002\u02f0\u02f1\u0007\t\u0002\u0002\u02f1\u02f2",
    "\u0005\u00be`\u0002\u02f2{\u0003\u0002\u0002\u0002\u02f3\u02f4\u0007",
    "\u0016\u0002\u0002\u02f4\u02f5\u0007G\u0002\u0002\u02f5\u02f6\u0007",
    "\u007f\u0002\u0002\u02f6\u02f7\u0007H\u0002\u0002\u02f7}\u0003\u0002",
    "\u0002\u0002\u02f8\u02fc\u0005v<\u0002\u02f9\u02fb\u0005x=\u0002\u02fa",
    "\u02f9\u0003\u0002\u0002\u0002\u02fb\u02fe\u0003\u0002\u0002\u0002\u02fc",
    "\u02fa\u0003\u0002\u0002\u0002\u02fc\u02fd\u0003\u0002\u0002\u0002\u02fd",
    "\u0300\u0003\u0002\u0002\u0002\u02fe\u02fc\u0003\u0002\u0002\u0002\u02ff",
    "\u0301\u0005z>\u0002\u0300\u02ff\u0003\u0002\u0002\u0002\u0300\u0301",
    "\u0003\u0002\u0002\u0002\u0301\u007f\u0003\u0002\u0002\u0002\u0302\u0303",
    "\u0007\u0014\u0002\u0002\u0303\u0304\u0007G\u0002\u0002\u0304\u0305",
    "\u0005V,\u0002\u0305\u0306\u0007H\u0002\u0002\u0306\u0307\u0005\u00be",
    "`\u0002\u0307\u0081\u0003\u0002\u0002\u0002\u0308\u0309\u0007\u0003",
    "\u0002\u0002\u0309\u030a\u0005\u00be`\u0002\u030a\u0083\u0003\u0002",
    "\u0002\u0002\u030b\u030d\u0005\u0088E\u0002\u030c\u030b\u0003\u0002",
    "\u0002\u0002\u030c\u030d\u0003\u0002\u0002\u0002\u030d\u030e\u0003\u0002",
    "\u0002\u0002\u030e\u030f\u0005\u00a4S\u0002\u030f\u0310\u0005\u00be",
    "`\u0002\u0310\u0085\u0003\u0002\u0002\u0002\u0311\u0313\u0005\u0088",
    "E\u0002\u0312\u0314\u0005\u008eH\u0002\u0313\u0312\u0003\u0002\u0002",
    "\u0002\u0313\u0314\u0003\u0002\u0002\u0002\u0314\u0315\u0003\u0002\u0002",
    "\u0002\u0315\u0316\u0007M\u0002\u0002\u0316\u0087\u0003\u0002\u0002",
    "\u0002\u0317\u031c\u0005\u008aF\u0002\u0318\u031c\u0005\u008cG\u0002",
    "\u0319\u031c\u0005P)\u0002\u031a\u031c\u0005R*\u0002\u031b\u0317\u0003",
    "\u0002\u0002\u0002\u031b\u0318\u0003\u0002\u0002\u0002\u031b\u0319\u0003",
    "\u0002\u0002\u0002\u031b\u031a\u0003\u0002\u0002\u0002\u031c\u031d\u0003",
    "\u0002\u0002\u0002\u031d\u031b\u0003\u0002\u0002\u0002\u031d\u031e\u0003",
    "\u0002\u0002\u0002\u031e\u0089\u0003\u0002\u0002\u0002\u031f\u0320\t",
    "\u0005\u0002\u0002\u0320\u008b\u0003\u0002\u0002\u0002\u0321\u0322\t",
    "\u0006\u0002\u0002\u0322\u008d\u0003\u0002\u0002\u0002\u0323\u0328\u0005",
    "\u0090I\u0002\u0324\u0325\u0007N\u0002\u0002\u0325\u0327\u0005\u0090",
    "I\u0002\u0326\u0324\u0003\u0002\u0002\u0002\u0327\u032a\u0003\u0002",
    "\u0002\u0002\u0328\u0326\u0003\u0002\u0002\u0002\u0328\u0329\u0003\u0002",
    "\u0002\u0002\u0329\u008f\u0003\u0002\u0002\u0002\u032a\u0328\u0003\u0002",
    "\u0002\u0002\u032b\u032e\u0005\u00a4S\u0002\u032c\u032d\u0007R\u0002",
    "\u0002\u032d\u032f\u0005\u00aeX\u0002\u032e\u032c\u0003\u0002\u0002",
    "\u0002\u032e\u032f\u0003\u0002\u0002\u0002\u032f\u0091\u0003\u0002\u0002",
    "\u0002\u0330\u033d\t\u0007\u0002\u0002\u0331\u033e\u0007\u007f\u0002",
    "\u0002\u0332\u0334\u0007\u007f\u0002\u0002\u0333\u0332\u0003\u0002\u0002",
    "\u0002\u0333\u0334\u0003\u0002\u0002\u0002\u0334\u0335\u0003\u0002\u0002",
    "\u0002\u0335\u0337\u0007I\u0002\u0002\u0336\u0338\u0005\u0094K\u0002",
    "\u0337\u0336\u0003\u0002\u0002\u0002\u0338\u0339\u0003\u0002\u0002\u0002",
    "\u0339\u0337\u0003\u0002\u0002\u0002\u0339\u033a\u0003\u0002\u0002\u0002",
    "\u033a\u033b\u0003\u0002\u0002\u0002\u033b\u033c\u0007J\u0002\u0002",
    "\u033c\u033e\u0003\u0002\u0002\u0002\u033d\u0331\u0003\u0002\u0002\u0002",
    "\u033d\u0333\u0003\u0002\u0002\u0002\u033e\u0093\u0003\u0002\u0002\u0002",
    "\u033f\u0340\u0005\u0096L\u0002\u0340\u0341\u0005\u0098M\u0002\u0341",
    "\u0342\u0007M\u0002\u0002\u0342\u0095\u0003\u0002\u0002\u0002\u0343",
    "\u0347\u0005\u008aF\u0002\u0344\u0347\u0005P)\u0002\u0345\u0347\u0005",
    "R*\u0002\u0346\u0343\u0003\u0002\u0002\u0002\u0346\u0344\u0003\u0002",
    "\u0002\u0002\u0346\u0345\u0003\u0002\u0002\u0002\u0347\u0348\u0003\u0002",
    "\u0002\u0002\u0348\u0346\u0003\u0002\u0002\u0002\u0348\u0349\u0003\u0002",
    "\u0002\u0002\u0349\u0097\u0003\u0002\u0002\u0002\u034a\u034f\u0005\u009a",
    "N\u0002\u034b\u034c\u0007N\u0002\u0002\u034c\u034e\u0005\u009aN\u0002",
    "\u034d\u034b\u0003\u0002\u0002\u0002\u034e\u0351\u0003\u0002\u0002\u0002",
    "\u034f\u034d\u0003\u0002\u0002\u0002\u034f\u0350\u0003\u0002\u0002\u0002",
    "\u0350\u0099\u0003\u0002\u0002\u0002\u0351\u034f\u0003\u0002\u0002\u0002",
    "\u0352\u0359\u0005\u00a4S\u0002\u0353\u0355\u0005\u00a4S\u0002\u0354",
    "\u0353\u0003\u0002\u0002\u0002\u0354\u0355\u0003\u0002\u0002\u0002\u0355",
    "\u0356\u0003\u0002\u0002\u0002\u0356\u0357\u0007X\u0002\u0002\u0357",
    "\u0359\u0005\u00f8}\u0002\u0358\u0352\u0003\u0002\u0002\u0002\u0358",
    "\u0354\u0003\u0002\u0002\u0002\u0359\u009b\u0003\u0002\u0002\u0002\u035a",
    "\u035d\u0007(\u0002\u0002\u035b\u035c\u0007X\u0002\u0002\u035c\u035e",
    "\u0005\u00b0Y\u0002\u035d\u035b\u0003\u0002\u0002\u0002\u035d\u035e",
    "\u0003\u0002\u0002\u0002\u035e\u036a\u0003\u0002\u0002\u0002\u035f\u0364",
    "\u0005\u00f6|\u0002\u0360\u0361\u0007I\u0002\u0002\u0361\u0362\u0005",
    "\u009eP\u0002\u0362\u0363\u0007J\u0002\u0002\u0363\u0365\u0003\u0002",
    "\u0002\u0002\u0364\u0360\u0003\u0002\u0002\u0002\u0364\u0365\u0003\u0002",
    "\u0002\u0002\u0365\u036b\u0003\u0002\u0002\u0002\u0366\u0367\u0007I",
    "\u0002\u0002\u0367\u0368\u0005\u009eP\u0002\u0368\u0369\u0007J\u0002",
    "\u0002\u0369\u036b\u0003\u0002\u0002\u0002\u036a\u035f\u0003\u0002\u0002",
    "\u0002\u036a\u0366\u0003\u0002\u0002\u0002\u036b\u0381\u0003\u0002\u0002",
    "\u0002\u036c\u036d\u0007C\u0002\u0002\u036d\u036e\u0007G\u0002\u0002",
    "\u036e\u036f\u0005\u00b0Y\u0002\u036f\u0370\u0007N\u0002\u0002\u0370",
    "\u0371\u0005\u00f6|\u0002\u0371\u0372\u0007H\u0002\u0002\u0372\u0373",
    "\u0007I\u0002\u0002\u0373\u0374\u0005\u009eP\u0002\u0374\u0375\u0007",
    "J\u0002\u0002\u0375\u0381\u0003\u0002\u0002\u0002\u0376\u0377\u0007",
    "D\u0002\u0002\u0377\u0378\u0007G\u0002\u0002\u0378\u0379\u0005\u00b0",
    "Y\u0002\u0379\u037a\u0007N\u0002\u0002\u037a\u037b\u0005\u00f6|\u0002",
    "\u037b\u037c\u0007H\u0002\u0002\u037c\u037d\u0007I\u0002\u0002\u037d",
    "\u037e\u0005\u009eP\u0002\u037e\u037f\u0007J\u0002\u0002\u037f\u0381",
    "\u0003\u0002\u0002\u0002\u0380\u035a\u0003\u0002\u0002\u0002\u0380\u036c",
    "\u0003\u0002\u0002\u0002\u0380\u0376\u0003\u0002\u0002\u0002\u0381\u009d",
    "\u0003\u0002\u0002\u0002\u0382\u0387\u0005\u00a0Q\u0002\u0383\u0384",
    "\u0007N\u0002\u0002\u0384\u0386\u0005\u00a0Q\u0002\u0385\u0383\u0003",
    "\u0002\u0002\u0002\u0386\u0389\u0003\u0002\u0002\u0002\u0387\u0385\u0003",
    "\u0002\u0002\u0002\u0387\u0388\u0003\u0002\u0002\u0002\u0388\u038b\u0003",
    "\u0002\u0002\u0002\u0389\u0387\u0003\u0002\u0002\u0002\u038a\u038c\u0007",
    "N\u0002\u0002\u038b\u038a\u0003\u0002\u0002\u0002\u038b\u038c\u0003",
    "\u0002\u0002\u0002\u038c\u009f\u0003\u0002\u0002\u0002\u038d\u0390\u0005",
    "\u00f6|\u0002\u038e\u038f\u0007R\u0002\u0002\u038f\u0391\u0005\u00d6",
    "l\u0002\u0390\u038e\u0003\u0002\u0002\u0002\u0390\u0391\u0003\u0002",
    "\u0002\u0002\u0391\u00a1\u0003\u0002\u0002\u0002\u0392\u0394\u0007c",
    "\u0002\u0002\u0393\u0395\u0005\u0088E\u0002\u0394\u0393\u0003\u0002",
    "\u0002\u0002\u0394\u0395\u0003\u0002\u0002\u0002\u0395\u039c\u0003\u0002",
    "\u0002\u0002\u0396\u0398\u0007c\u0002\u0002\u0397\u0399\u0005\u0088",
    "E\u0002\u0398\u0397\u0003\u0002\u0002\u0002\u0398\u0399\u0003\u0002",
    "\u0002\u0002\u0399\u039a\u0003\u0002\u0002\u0002\u039a\u039c\u0005\u00a2",
    "R\u0002\u039b\u0392\u0003\u0002\u0002\u0002\u039b\u0396\u0003\u0002",
    "\u0002\u0002\u039c\u00a3\u0003\u0002\u0002\u0002\u039d\u039f\u0005\u00a2",
    "R\u0002\u039e\u039d\u0003\u0002\u0002\u0002\u039e\u039f\u0003\u0002",
    "\u0002\u0002\u039f\u03a0\u0003\u0002\u0002\u0002\u03a0\u03a1\u0005\u00a6",
    "T\u0002\u03a1\u00a5\u0003\u0002\u0002\u0002\u03a2\u03a6\u0005\u00f6",
    "|\u0002\u03a3\u03a5\u0005\u00a8U\u0002\u03a4\u03a3\u0003\u0002\u0002",
    "\u0002\u03a5\u03a8\u0003\u0002\u0002\u0002\u03a6\u03a4\u0003\u0002\u0002",
    "\u0002\u03a6\u03a7\u0003\u0002\u0002\u0002\u03a7\u03ba\u0003\u0002\u0002",
    "\u0002\u03a8\u03a6\u0003\u0002\u0002\u0002\u03a9\u03aa\u0007G\u0002",
    "\u0002\u03aa\u03ab\u0005\u00a4S\u0002\u03ab\u03af\u0007H\u0002\u0002",
    "\u03ac\u03ae\u0005\u00a8U\u0002\u03ad\u03ac\u0003\u0002\u0002\u0002",
    "\u03ae\u03b1\u0003\u0002\u0002\u0002\u03af\u03ad\u0003\u0002\u0002\u0002",
    "\u03af\u03b0\u0003\u0002\u0002\u0002\u03b0\u03ba\u0003\u0002\u0002\u0002",
    "\u03b1\u03af\u0003\u0002\u0002\u0002\u03b2\u03b3\u0007G\u0002\u0002",
    "\u03b3\u03b5\u0007g\u0002\u0002\u03b4\u03b6\u0005\u00f6|\u0002\u03b5",
    "\u03b4\u0003\u0002\u0002\u0002\u03b5\u03b6\u0003\u0002\u0002\u0002\u03b6",
    "\u03b7\u0003\u0002\u0002\u0002\u03b7\u03b8\u0007H\u0002\u0002\u03b8",
    "\u03ba\u0005`1\u0002\u03b9\u03a2\u0003\u0002\u0002\u0002\u03b9\u03a9",
    "\u0003\u0002\u0002\u0002\u03b9\u03b2\u0003\u0002\u0002\u0002\u03ba\u00a7",
    "\u0003\u0002\u0002\u0002\u03bb\u03bd\u0007K\u0002\u0002\u03bc\u03be",
    "\u0005\u00d6l\u0002\u03bd\u03bc\u0003\u0002\u0002\u0002\u03bd\u03be",
    "\u0003\u0002\u0002\u0002\u03be\u03bf\u0003\u0002\u0002\u0002\u03bf\u03c6",
    "\u0007L\u0002\u0002\u03c0\u03c2\u0007G\u0002\u0002\u03c1\u03c3\u0005",
    "\u00aaV\u0002\u03c2\u03c1\u0003\u0002\u0002\u0002\u03c2\u03c3\u0003",
    "\u0002\u0002\u0002\u03c3\u03c4\u0003\u0002\u0002\u0002\u03c4\u03c6\u0007",
    "H\u0002\u0002\u03c5\u03bb\u0003\u0002\u0002\u0002\u03c5\u03c0\u0003",
    "\u0002\u0002\u0002\u03c6\u00a9\u0003\u0002\u0002\u0002\u03c7\u03ca\u0005",
    "\u00b6\\\u0002\u03c8\u03c9\u0007N\u0002\u0002\u03c9\u03cb\u0007u\u0002",
    "\u0002\u03ca\u03c8\u0003\u0002\u0002\u0002\u03ca\u03cb\u0003\u0002\u0002",
    "\u0002\u03cb\u00ab\u0003\u0002\u0002\u0002\u03cc\u03d1\u0005\u0088E",
    "\u0002\u03cd\u03cf\u0005\u00a4S\u0002\u03ce\u03cd\u0003\u0002\u0002",
    "\u0002\u03ce\u03cf\u0003\u0002\u0002\u0002\u03cf\u03d2\u0003\u0002\u0002",
    "\u0002\u03d0\u03d2\u0005\u00b2Z\u0002\u03d1\u03ce\u0003\u0002\u0002",
    "\u0002\u03d1\u03d0\u0003\u0002\u0002\u0002\u03d2\u00ad\u0003\u0002\u0002",
    "\u0002\u03d3\u03e3\u0005\u00d0i\u0002\u03d4\u03d5\u0007I\u0002\u0002",
    "\u03d5\u03da\u0005\u00aeX\u0002\u03d6\u03d7\u0007N\u0002\u0002\u03d7",
    "\u03d9\u0005\u00aeX\u0002\u03d8\u03d6\u0003\u0002\u0002\u0002\u03d9",
    "\u03dc\u0003\u0002\u0002\u0002\u03da\u03d8\u0003\u0002\u0002\u0002\u03da",
    "\u03db\u0003\u0002\u0002\u0002\u03db\u03de\u0003\u0002\u0002\u0002\u03dc",
    "\u03da\u0003\u0002\u0002\u0002\u03dd\u03df\u0007N\u0002\u0002\u03de",
    "\u03dd\u0003\u0002\u0002\u0002\u03de\u03df\u0003\u0002\u0002\u0002\u03df",
    "\u03e0\u0003\u0002\u0002\u0002\u03e0\u03e1\u0007J\u0002\u0002\u03e1",
    "\u03e3\u0003\u0002\u0002\u0002\u03e2\u03d3\u0003\u0002\u0002\u0002\u03e2",
    "\u03d4\u0003\u0002\u0002\u0002\u03e3\u00af\u0003\u0002\u0002\u0002\u03e4",
    "\u03e5\u0005\u0096L\u0002\u03e5\u03e6\u0005\u00b2Z\u0002\u03e6\u03e9",
    "\u0003\u0002\u0002\u0002\u03e7\u03e9\u0005N(\u0002\u03e8\u03e4\u0003",
    "\u0002\u0002\u0002\u03e8\u03e7\u0003\u0002\u0002\u0002\u03e9\u00b1\u0003",
    "\u0002\u0002\u0002\u03ea\u03eb\u0005\u00a2R\u0002\u03eb\u03ec\u0005",
    "\u00b2Z\u0002\u03ec\u0400\u0003\u0002\u0002\u0002\u03ed\u03ee\u0007",
    "G\u0002\u0002\u03ee\u03ef\u0005\u00b2Z\u0002\u03ef\u03f1\u0007H\u0002",
    "\u0002\u03f0\u03f2\u0005\u00b4[\u0002\u03f1\u03f0\u0003\u0002\u0002",
    "\u0002\u03f2\u03f3\u0003\u0002\u0002\u0002\u03f3\u03f1\u0003\u0002\u0002",
    "\u0002\u03f3\u03f4\u0003\u0002\u0002\u0002\u03f4\u0400\u0003\u0002\u0002",
    "\u0002\u03f5\u03f7\u0007K\u0002\u0002\u03f6\u03f8\u0005\u00d6l\u0002",
    "\u03f7\u03f6\u0003\u0002\u0002\u0002\u03f7\u03f8\u0003\u0002\u0002\u0002",
    "\u03f8\u03f9\u0003\u0002\u0002\u0002\u03f9\u03fb\u0007L\u0002\u0002",
    "\u03fa\u03f5\u0003\u0002\u0002\u0002\u03fb\u03fc\u0003\u0002\u0002\u0002",
    "\u03fc\u03fa\u0003\u0002\u0002\u0002\u03fc\u03fd\u0003\u0002\u0002\u0002",
    "\u03fd\u0400\u0003\u0002\u0002\u0002\u03fe\u0400\u0003\u0002\u0002\u0002",
    "\u03ff\u03ea\u0003\u0002\u0002\u0002\u03ff\u03ed\u0003\u0002\u0002\u0002",
    "\u03ff\u03fa\u0003\u0002\u0002\u0002\u03ff\u03fe\u0003\u0002\u0002\u0002",
    "\u0400\u00b3\u0003\u0002\u0002\u0002\u0401\u0403\u0007K\u0002\u0002",
    "\u0402\u0404\u0005\u00d6l\u0002\u0403\u0402\u0003\u0002\u0002\u0002",
    "\u0403\u0404\u0003\u0002\u0002\u0002\u0404\u0405\u0003\u0002\u0002\u0002",
    "\u0405\u040c\u0007L\u0002\u0002\u0406\u0408\u0007G\u0002\u0002\u0407",
    "\u0409\u0005\u00b6\\\u0002\u0408\u0407\u0003\u0002\u0002\u0002\u0408",
    "\u0409\u0003\u0002\u0002\u0002\u0409\u040a\u0003\u0002\u0002\u0002\u040a",
    "\u040c\u0007H\u0002\u0002\u040b\u0401\u0003\u0002\u0002\u0002\u040b",
    "\u0406\u0003\u0002\u0002\u0002\u040c\u00b5\u0003\u0002\u0002\u0002\u040d",
    "\u0412\u0005\u00acW\u0002\u040e\u040f\u0007N\u0002\u0002\u040f\u0411",
    "\u0005\u00acW\u0002\u0410\u040e\u0003\u0002\u0002\u0002\u0411\u0414",
    "\u0003\u0002\u0002\u0002\u0412\u0410\u0003\u0002\u0002\u0002\u0412\u0413",
    "\u0003\u0002\u0002\u0002\u0413\u00b7\u0003\u0002\u0002\u0002\u0414\u0412",
    "\u0003\u0002\u0002\u0002\u0415\u0417\u0005\u00ba^\u0002\u0416\u0415",
    "\u0003\u0002\u0002\u0002\u0417\u0418\u0003\u0002\u0002\u0002\u0418\u0416",
    "\u0003\u0002\u0002\u0002\u0418\u0419\u0003\u0002\u0002\u0002\u0419\u00b9",
    "\u0003\u0002\u0002\u0002\u041a\u0427\u0005\u00bc_\u0002\u041b\u041c",
    "\u0005\u00ceh\u0002\u041c\u041d\u0007M\u0002\u0002\u041d\u0427\u0003",
    "\u0002\u0002\u0002\u041e\u0427\u0005\u00be`\u0002\u041f\u0427\u0005",
    "\u00c0a\u0002\u0420\u0427\u0005\u00caf\u0002\u0421\u0427\u0005\u00cc",
    "g\u0002\u0422\u0427\u0005\u0080A\u0002\u0423\u0427\u0005\u0082B\u0002",
    "\u0424\u0427\u0005~@\u0002\u0425\u0427\u0007M\u0002\u0002\u0426\u041a",
    "\u0003\u0002\u0002\u0002\u0426\u041b\u0003\u0002\u0002\u0002\u0426\u041e",
    "\u0003\u0002\u0002\u0002\u0426\u041f\u0003\u0002\u0002\u0002\u0426\u0420",
    "\u0003\u0002\u0002\u0002\u0426\u0421\u0003\u0002\u0002\u0002\u0426\u0422",
    "\u0003\u0002\u0002\u0002\u0426\u0423\u0003\u0002\u0002\u0002\u0426\u0424",
    "\u0003\u0002\u0002\u0002\u0426\u0425\u0003\u0002\u0002\u0002\u0427\u00bb",
    "\u0003\u0002\u0002\u0002\u0428\u0429\u0005\u00f6|\u0002\u0429\u042a",
    "\u0007X\u0002\u0002\u042a\u042b\u0005\u00ba^\u0002\u042b\u0435\u0003",
    "\u0002\u0002\u0002\u042c\u042d\u0007 \u0002\u0002\u042d\u042e\u0005",
    "\u00d6l\u0002\u042e\u042f\u0007X\u0002\u0002\u042f\u0430\u0005\u00ba",
    "^\u0002\u0430\u0435\u0003\u0002\u0002\u0002\u0431\u0432\u0007$\u0002",
    "\u0002\u0432\u0433\u0007X\u0002\u0002\u0433\u0435\u0005\u00ba^\u0002",
    "\u0434\u0428\u0003\u0002\u0002\u0002\u0434\u042c\u0003\u0002\u0002\u0002",
    "\u0434\u0431\u0003\u0002\u0002\u0002\u0435\u00bd\u0003\u0002\u0002\u0002",
    "\u0436\u043b\u0007I\u0002\u0002\u0437\u043a\u0005\u0086D\u0002\u0438",
    "\u043a\u0005\u00b8]\u0002\u0439\u0437\u0003\u0002\u0002\u0002\u0439",
    "\u0438\u0003\u0002\u0002\u0002\u043a\u043d\u0003\u0002\u0002\u0002\u043b",
    "\u0439\u0003\u0002\u0002\u0002\u043b\u043c\u0003\u0002\u0002\u0002\u043c",
    "\u043e\u0003\u0002\u0002\u0002\u043d\u043b\u0003\u0002\u0002\u0002\u043e",
    "\u043f\u0007J\u0002\u0002\u043f\u00bf\u0003\u0002\u0002\u0002\u0440",
    "\u0441\u0007-\u0002\u0002\u0441\u0442\u0007G\u0002\u0002\u0442\u0443",
    "\u0005\u00ceh\u0002\u0443\u0444\u0007H\u0002\u0002\u0444\u0447\u0005",
    "\u00ba^\u0002\u0445\u0446\u0007\'\u0002\u0002\u0446\u0448\u0005\u00ba",
    "^\u0002\u0447\u0445\u0003\u0002\u0002\u0002\u0447\u0448\u0003\u0002",
    "\u0002\u0002\u0448\u0450\u0003\u0002\u0002\u0002\u0449\u044a\u0007<",
    "\u0002\u0002\u044a\u044b\u0007G\u0002\u0002\u044b\u044c\u0005\u00ce",
    "h\u0002\u044c\u044d\u0007H\u0002\u0002\u044d\u044e\u0005\u00ba^\u0002",
    "\u044e\u0450\u0003\u0002\u0002\u0002\u044f\u0440\u0003\u0002\u0002\u0002",
    "\u044f\u0449\u0003\u0002\u0002\u0002\u0450\u00c1\u0003\u0002\u0002\u0002",
    "\u0451\u0452\u0007+\u0002\u0002\u0452\u0453\u0007G\u0002\u0002\u0453",
    "\u0454\u0005t;\u0002\u0454\u0456\u0007.\u0002\u0002\u0455\u0457\u0005",
    "\u00ceh\u0002\u0456\u0455\u0003\u0002\u0002\u0002\u0456\u0457\u0003",
    "\u0002\u0002\u0002\u0457\u0458\u0003\u0002\u0002\u0002\u0458\u0459\u0007",
    "H\u0002\u0002\u0459\u045a\u0005\u00ba^\u0002\u045a\u00c3\u0003\u0002",
    "\u0002\u0002\u045b\u045c\u0007+\u0002\u0002\u045c\u0461\u0007G\u0002",
    "\u0002\u045d\u045e\u0005\u0088E\u0002\u045e\u045f\u0005\u008eH\u0002",
    "\u045f\u0462\u0003\u0002\u0002\u0002\u0460\u0462\u0005\u00ceh\u0002",
    "\u0461\u045d\u0003\u0002\u0002\u0002\u0461\u0460\u0003\u0002\u0002\u0002",
    "\u0461\u0462\u0003\u0002\u0002\u0002\u0462\u0463\u0003\u0002\u0002\u0002",
    "\u0463\u0465\u0007M\u0002\u0002\u0464\u0466\u0005\u00ceh\u0002\u0465",
    "\u0464\u0003\u0002\u0002\u0002\u0465\u0466\u0003\u0002\u0002\u0002\u0466",
    "\u0467\u0003\u0002\u0002\u0002\u0467\u0469\u0007M\u0002\u0002\u0468",
    "\u046a\u0005\u00ceh\u0002\u0469\u0468\u0003\u0002\u0002\u0002\u0469",
    "\u046a\u0003\u0002\u0002\u0002\u046a\u046b\u0003\u0002\u0002\u0002\u046b",
    "\u046c\u0007H\u0002\u0002\u046c\u046d\u0005\u00ba^\u0002\u046d\u00c5",
    "\u0003\u0002\u0002\u0002\u046e\u046f\u0007B\u0002\u0002\u046f\u0470",
    "\u0007G\u0002\u0002\u0470\u0471\u0005\u00ceh\u0002\u0471\u0472\u0007",
    "H\u0002\u0002\u0472\u0473\u0005\u00ba^\u0002\u0473\u00c7\u0003\u0002",
    "\u0002\u0002\u0474\u0475\u0007%\u0002\u0002\u0475\u0476\u0005\u00ba",
    "^\u0002\u0476\u0477\u0007B\u0002\u0002\u0477\u0478\u0007G\u0002\u0002",
    "\u0478\u0479\u0005\u00ceh\u0002\u0479\u047a\u0007H\u0002\u0002\u047a",
    "\u047b\u0007M\u0002\u0002\u047b\u00c9\u0003\u0002\u0002\u0002\u047c",
    "\u0481\u0005\u00c6d\u0002\u047d\u0481\u0005\u00c8e\u0002\u047e\u0481",
    "\u0005\u00c4c\u0002\u047f\u0481\u0005\u00c2b\u0002\u0480\u047c\u0003",
    "\u0002\u0002\u0002\u0480\u047d\u0003\u0002\u0002\u0002\u0480\u047e\u0003",
    "\u0002\u0002\u0002\u0480\u047f\u0003\u0002\u0002\u0002\u0481\u00cb\u0003",
    "\u0002\u0002\u0002\u0482\u0483\u00070\u0002\u0002\u0483\u0484\u0005",
    "\u00f6|\u0002\u0484\u0485\u0007M\u0002\u0002\u0485\u0490\u0003\u0002",
    "\u0002\u0002\u0486\u0487\u0007#\u0002\u0002\u0487\u0490\u0007M\u0002",
    "\u0002\u0488\u0489\u0007\u001d\u0002\u0002\u0489\u0490\u0007M\u0002",
    "\u0002\u048a\u048c\u00076\u0002\u0002\u048b\u048d\u0005\u00ceh\u0002",
    "\u048c\u048b\u0003\u0002\u0002\u0002\u048c\u048d\u0003\u0002\u0002\u0002",
    "\u048d\u048e\u0003\u0002\u0002\u0002\u048e\u0490\u0007M\u0002\u0002",
    "\u048f\u0482\u0003\u0002\u0002\u0002\u048f\u0486\u0003\u0002\u0002\u0002",
    "\u048f\u0488\u0003\u0002\u0002\u0002\u048f\u048a\u0003\u0002\u0002\u0002",
    "\u0490\u00cd\u0003\u0002\u0002\u0002\u0491\u0496\u0005\u00d0i\u0002",
    "\u0492\u0493\u0007N\u0002\u0002\u0493\u0495\u0005\u00d0i\u0002\u0494",
    "\u0492\u0003\u0002\u0002\u0002\u0495\u0498\u0003\u0002\u0002\u0002\u0496",
    "\u0494\u0003\u0002\u0002\u0002\u0496\u0497\u0003\u0002\u0002\u0002\u0497",
    "\u00cf\u0003\u0002\u0002\u0002\u0498\u0496\u0003\u0002\u0002\u0002\u0499",
    "\u049f\u0005\u00d4k\u0002\u049a\u049b\u0005\u00eex\u0002\u049b\u049c",
    "\u0005\u00d2j\u0002\u049c\u049d\u0005\u00d0i\u0002\u049d\u049f\u0003",
    "\u0002\u0002\u0002\u049e\u0499\u0003\u0002\u0002\u0002\u049e\u049a\u0003",
    "\u0002\u0002\u0002\u049f\u00d1\u0003\u0002\u0002\u0002\u04a0\u04a1\t",
    "\b\u0002\u0002\u04a1\u00d3\u0003\u0002\u0002\u0002\u04a2\u04a8\u0005",
    "\u00d8m\u0002\u04a3\u04a4\u0007W\u0002\u0002\u04a4\u04a5\u0005\u00d4",
    "k\u0002\u04a5\u04a6\u0007X\u0002\u0002\u04a6\u04a7\u0005\u00d4k\u0002",
    "\u04a7\u04a9\u0003\u0002\u0002\u0002\u04a8\u04a3\u0003\u0002\u0002\u0002",
    "\u04a8\u04a9\u0003\u0002\u0002\u0002\u04a9\u00d5\u0003\u0002\u0002\u0002",
    "\u04aa\u04ab\u0005\u00d4k\u0002\u04ab\u00d7\u0003\u0002\u0002\u0002",
    "\u04ac\u04b1\u0005\u00dan\u0002\u04ad\u04ae\u0007^\u0002\u0002\u04ae",
    "\u04b0\u0005\u00dan\u0002\u04af\u04ad\u0003\u0002\u0002\u0002\u04b0",
    "\u04b3\u0003\u0002\u0002\u0002\u04b1\u04af\u0003\u0002\u0002\u0002\u04b1",
    "\u04b2\u0003\u0002\u0002\u0002\u04b2\u00d9\u0003\u0002\u0002\u0002\u04b3",
    "\u04b1\u0003\u0002\u0002\u0002\u04b4\u04b9\u0005\u00dco\u0002\u04b5",
    "\u04b6\u0007]\u0002\u0002\u04b6\u04b8\u0005\u00dco\u0002\u04b7\u04b5",
    "\u0003\u0002\u0002\u0002\u04b8\u04bb\u0003\u0002\u0002\u0002\u04b9\u04b7",
    "\u0003\u0002\u0002\u0002\u04b9\u04ba\u0003\u0002\u0002\u0002\u04ba\u00db",
    "\u0003\u0002\u0002\u0002\u04bb\u04b9\u0003\u0002\u0002\u0002\u04bc\u04c1",
    "\u0005\u00dep\u0002\u04bd\u04be\u0007f\u0002\u0002\u04be\u04c0\u0005",
    "\u00dep\u0002\u04bf\u04bd\u0003\u0002\u0002\u0002\u04c0\u04c3\u0003",
    "\u0002\u0002\u0002\u04c1\u04bf\u0003\u0002\u0002\u0002\u04c1\u04c2\u0003",
    "\u0002\u0002\u0002\u04c2\u00dd\u0003\u0002\u0002\u0002\u04c3\u04c1\u0003",
    "\u0002\u0002\u0002\u04c4\u04c9\u0005\u00e0q\u0002\u04c5\u04c6\u0007",
    "g\u0002\u0002\u04c6\u04c8\u0005\u00e0q\u0002\u04c7\u04c5\u0003\u0002",
    "\u0002\u0002\u04c8\u04cb\u0003\u0002\u0002\u0002\u04c9\u04c7\u0003\u0002",
    "\u0002\u0002\u04c9\u04ca\u0003\u0002\u0002\u0002\u04ca\u00df\u0003\u0002",
    "\u0002\u0002\u04cb\u04c9\u0003\u0002\u0002\u0002\u04cc\u04d1\u0005\u00e2",
    "r\u0002\u04cd\u04ce\u0007e\u0002\u0002\u04ce\u04d0\u0005\u00e2r\u0002",
    "\u04cf\u04cd\u0003\u0002\u0002\u0002\u04d0\u04d3\u0003\u0002\u0002\u0002",
    "\u04d1\u04cf\u0003\u0002\u0002\u0002\u04d1\u04d2\u0003\u0002\u0002\u0002",
    "\u04d2\u00e1\u0003\u0002\u0002\u0002\u04d3\u04d1\u0003\u0002\u0002\u0002",
    "\u04d4\u04d9\u0005\u00e4s\u0002\u04d5\u04d6\t\t\u0002\u0002\u04d6\u04d8",
    "\u0005\u00e4s\u0002\u04d7\u04d5\u0003\u0002\u0002\u0002\u04d8\u04db",
    "\u0003\u0002\u0002\u0002\u04d9\u04d7\u0003\u0002\u0002\u0002\u04d9\u04da",
    "\u0003\u0002\u0002\u0002\u04da\u00e3\u0003\u0002\u0002\u0002\u04db\u04d9",
    "\u0003\u0002\u0002\u0002\u04dc\u04e1\u0005\u00e6t\u0002\u04dd\u04de",
    "\t\n\u0002\u0002\u04de\u04e0\u0005\u00e6t\u0002\u04df\u04dd\u0003\u0002",
    "\u0002\u0002\u04e0\u04e3\u0003\u0002\u0002\u0002\u04e1\u04df\u0003\u0002",
    "\u0002\u0002\u04e1\u04e2\u0003\u0002\u0002\u0002\u04e2\u00e5\u0003\u0002",
    "\u0002\u0002\u04e3\u04e1\u0003\u0002\u0002\u0002\u04e4\u04e9\u0005\u00e8",
    "u\u0002\u04e5\u04e6\t\u000b\u0002\u0002\u04e6\u04e8\u0005\u00e8u\u0002",
    "\u04e7\u04e5\u0003\u0002\u0002\u0002\u04e8\u04eb\u0003\u0002\u0002\u0002",
    "\u04e9\u04e7\u0003\u0002\u0002\u0002\u04e9\u04ea\u0003\u0002\u0002\u0002",
    "\u04ea\u00e7\u0003\u0002\u0002\u0002\u04eb\u04e9\u0003\u0002\u0002\u0002",
    "\u04ec\u04f1\u0005\u00eav\u0002\u04ed\u04ee\t\f\u0002\u0002\u04ee\u04f0",
    "\u0005\u00eav\u0002\u04ef\u04ed\u0003\u0002\u0002\u0002\u04f0\u04f3",
    "\u0003\u0002\u0002\u0002\u04f1\u04ef\u0003\u0002\u0002\u0002\u04f1\u04f2",
    "\u0003\u0002\u0002\u0002\u04f2\u00e9\u0003\u0002\u0002\u0002\u04f3\u04f1",
    "\u0003\u0002\u0002\u0002\u04f4\u04f9\u0005\u00ecw\u0002\u04f5\u04f6",
    "\t\r\u0002\u0002\u04f6\u04f8\u0005\u00ecw\u0002\u04f7\u04f5\u0003\u0002",
    "\u0002\u0002\u04f8\u04fb\u0003\u0002\u0002\u0002\u04f9\u04f7\u0003\u0002",
    "\u0002\u0002\u04f9\u04fa\u0003\u0002\u0002\u0002\u04fa\u00eb\u0003\u0002",
    "\u0002\u0002\u04fb\u04f9\u0003\u0002\u0002\u0002\u04fc\u04fd\u0007G",
    "\u0002\u0002\u04fd\u04fe\u0005\u00b0Y\u0002\u04fe\u04ff\u0007H\u0002",
    "\u0002\u04ff\u0500\u0005\u00ecw\u0002\u0500\u0503\u0003\u0002\u0002",
    "\u0002\u0501\u0503\u0005\u00eex\u0002\u0502\u04fc\u0003\u0002\u0002",
    "\u0002\u0502\u0501\u0003\u0002\u0002\u0002\u0503\u00ed\u0003\u0002\u0002",
    "\u0002\u0504\u0515\u0005\u00f2z\u0002\u0505\u0506\u0007_\u0002\u0002",
    "\u0506\u0515\u0005\u00eex\u0002\u0507\u0508\u0007`\u0002\u0002\u0508",
    "\u0515\u0005\u00eex\u0002\u0509\u050a\u0005\u00f0y\u0002\u050a\u050b",
    "\u0005\u00ecw\u0002\u050b\u0515\u0003\u0002\u0002\u0002\u050c\u0512",
    "\u00079\u0002\u0002\u050d\u050e\u0007G\u0002\u0002\u050e\u050f\u0005",
    "\u00b0Y\u0002\u050f\u0510\u0007H\u0002\u0002\u0510\u0513\u0003\u0002",
    "\u0002\u0002\u0511\u0513\u0005\u00eex\u0002\u0512\u050d\u0003\u0002",
    "\u0002\u0002\u0512\u0511\u0003\u0002\u0002\u0002\u0513\u0515\u0003\u0002",
    "\u0002\u0002\u0514\u0504\u0003\u0002\u0002\u0002\u0514\u0505\u0003\u0002",
    "\u0002\u0002\u0514\u0507\u0003\u0002\u0002\u0002\u0514\u0509\u0003\u0002",
    "\u0002\u0002\u0514\u050c\u0003\u0002\u0002\u0002\u0515\u00ef\u0003\u0002",
    "\u0002\u0002\u0516\u0517\t\u000e\u0002\u0002\u0517\u00f1\u0003\u0002",
    "\u0002\u0002\u0518\u052a\u0005V,\u0002\u0519\u051a\u0007K\u0002\u0002",
    "\u051a\u051b\u0005\u00ceh\u0002\u051b\u051c\u0007L\u0002\u0002\u051c",
    "\u0529\u0003\u0002\u0002\u0002\u051d\u051f\u0007G\u0002\u0002\u051e",
    "\u0520\u0005\u00f4{\u0002\u051f\u051e\u0003\u0002\u0002\u0002\u051f",
    "\u0520\u0003\u0002\u0002\u0002\u0520\u0521\u0003\u0002\u0002\u0002\u0521",
    "\u0529\u0007H\u0002\u0002\u0522\u0523\u0007O\u0002\u0002\u0523\u0529",
    "\u0005\u00f6|\u0002\u0524\u0525\u0007P\u0002\u0002\u0525\u0529\u0005",
    "\u00f6|\u0002\u0526\u0529\u0007_\u0002\u0002\u0527\u0529\u0007`\u0002",
    "\u0002\u0528\u0519\u0003\u0002\u0002\u0002\u0528\u051d\u0003\u0002\u0002",
    "\u0002\u0528\u0522\u0003\u0002\u0002\u0002\u0528\u0524\u0003\u0002\u0002",
    "\u0002\u0528\u0526\u0003\u0002\u0002\u0002\u0528\u0527\u0003\u0002\u0002",
    "\u0002\u0529\u052c\u0003\u0002\u0002\u0002\u052a\u0528\u0003\u0002\u0002",
    "\u0002\u052a\u052b\u0003\u0002\u0002\u0002\u052b\u00f3\u0003\u0002\u0002",
    "\u0002\u052c\u052a\u0003\u0002\u0002\u0002\u052d\u0532\u0005\u00d0i",
    "\u0002\u052e\u052f\u0007N\u0002\u0002\u052f\u0531\u0005\u00d0i\u0002",
    "\u0530\u052e\u0003\u0002\u0002\u0002\u0531\u0534\u0003\u0002\u0002\u0002",
    "\u0532\u0530\u0003\u0002\u0002\u0002\u0532\u0533\u0003\u0002\u0002\u0002",
    "\u0533\u00f5\u0003\u0002\u0002\u0002\u0534\u0532\u0003\u0002\u0002\u0002",
    "\u0535\u0536\u0007\u007f\u0002\u0002\u0536\u00f7\u0003\u0002\u0002\u0002",
    "\u0537\u0538\t\u000f\u0002\u0002\u0538\u00f9\u0003\u0002\u0002\u0002",
    "\u009a\u00fd\u010d\u0115\u0118\u011b\u011e\u0126\u012a\u012d\u0130\u0138",
    "\u013b\u013e\u0148\u014f\u0152\u0155\u0158\u0169\u0175\u017a\u0187\u019a",
    "\u01a8\u01b1\u01b9\u01c3\u01c8\u01d0\u01d2\u01db\u01e5\u01e7\u01f0\u01f4",
    "\u01f7\u01ff\u0202\u0204\u0207\u020d\u0220\u0227\u022e\u0234\u0238\u0245",
    "\u0249\u0250\u0255\u026a\u0273\u0279\u027d\u0284\u028a\u028e\u0299\u029e",
    "\u02a4\u02ab\u02ae\u02ba\u02c0\u02c2\u02c5\u02d1\u02d6\u02d8\u02fc\u0300",
    "\u030c\u0313\u031b\u031d\u0328\u032e\u0333\u0339\u033d\u0346\u0348\u034f",
    "\u0354\u0358\u035d\u0364\u036a\u0380\u0387\u038b\u0390\u0394\u0398\u039b",
    "\u039e\u03a6\u03af\u03b5\u03b9\u03bd\u03c2\u03c5\u03ca\u03ce\u03d1\u03da",
    "\u03de\u03e2\u03e8\u03f3\u03f7\u03fc\u03ff\u0403\u0408\u040b\u0412\u0418",
    "\u0426\u0434\u0439\u043b\u0447\u044f\u0456\u0461\u0465\u0469\u0480\u048c",
    "\u048f\u0496\u049e\u04a8\u04b1\u04b9\u04c1\u04c9\u04d1\u04d9\u04e1\u04e9",
    "\u04f1\u04f9\u0502\u0512\u0514\u051f\u0528\u052a\u0532"].join("");


var atn = new antlr4.atn.ATNDeserializer().deserialize(serializedATN);

var decisionsToDFA = atn.decisionToState.map( function(ds, index) { return new antlr4.dfa.DFA(ds, index); });

var sharedContextCache = new antlr4.PredictionContextCache();

var literalNames = [ 'null', "'@autoreleasepool'", "'@catch'", "'@class'", 
                     "'@dynamic'", "'@encode'", "'@end'", "'@finally'", 
                     "'@implementation'", "'@interface'", "'@package'", 
                     "'@protocol'", "'@optional'", "'@private'", "'@property'", 
                     "'@protected'", "'@public'", "'@selector'", "'@synchronized'", 
                     "'@synthesize'", "'@throw'", "'@try'", "'super'", "'self'", 
                     "'abstract'", "'auto'", "'boolean'", "'break'", "'bycopy'", 
                     "'byref'", "'case'", "'char'", "'const'", "'continue'", 
                     "'default'", "'do'", "'double'", "'else'", "'enum'", 
                     "'extern'", "'float'", "'for'", "'id'", "'if'", "'in'", 
                     "'inout'", "'goto'", "'int'", "'long'", "'oneway'", 
                     "'out'", "'register'", "'return'", "'short'", "'signed'", 
                     "'sizeof'", "'static'", "'struct'", "'switch'", "'typedef'", 
                     "'union'", "'unsigned'", "'void'", "'volatile'", "'while'", 
                     "'NS_OPTIONS'", "'NS_ENUM'", "'__weak'", "'__unsafe_unretained'", 
                     "'('", "')'", "'{'", "'}'", "'['", "']'", "';'", "','", 
                     "'.'", "'->'", "'@'", "'='", "'>'", "'<'", "'!'", "'~'", 
                     "'?'", "':'", "'=='", "'<='", "'>='", "'!='", "'&&'", 
                     "'||'", "'++'", "'--'", "'+'", "'-'", "'*'", "'/'", 
                     "'&'", "'|'", "'^'", "'%'", "'>>'", "'<<'", "'+='", 
                     "'-='", "'*='", "'/='", "'&='", "'|='", "'^='", "'%='", 
                     "'<<='", "'>>='", "'...'", "'assign'", "'getter'", 
                     "'nonatomic'", "'setter'", "'strong'", "'retain'", 
                     "'readonly'", "'readwrite'", "'weak'" ];

var symbolicNames = [ 'null', "AUTORELEASEPOOL", "CATCH", "CLASS", "DYNAMIC", 
                      "ENCODE", "END", "FINALLY", "IMPLEMENTATION", "INTERFACE", 
                      "PACKAGE", "PROTOCOL", "OPTIONAL", "PRIVATE", "PROPERTY", 
                      "PROTECTED", "PUBLIC", "SELECTOR", "SYNCHRONIZED", 
                      "SYNTHESIZE", "THROW", "TRY", "SUPER", "SELF", "ABSTRACT", 
                      "AUTO", "BOOLEAN", "BREAK", "BYCOPY", "BYREF", "CASE", 
                      "CHAR", "CONST", "CONTINUE", "DEFAULT", "DO", "DOUBLE", 
                      "ELSE", "ENUM", "EXTERN", "FLOAT", "FOR", "ID", "IF", 
                      "IN", "INOUT", "GOTO", "INT", "LONG", "ONEWAY", "OUT", 
                      "REGISTER", "RETURN", "SHORT", "SIGNED", "SIZEOF", 
                      "STATIC", "STRUCT", "SWITCH", "TYPEDEF", "UNION", 
                      "UNSIGNED", "VOID", "VOLATILE", "WHILE", "NS_OPTIONS", 
                      "NS_ENUM", "WWEAK", "WUNSAFE_UNRETAINED", "LPAREN", 
                      "RPAREN", "LBRACE", "RBRACE", "LBRACK", "RBRACK", 
                      "SEMI", "COMMA", "DOT", "STRUCTACCESS", "AT", "ASSIGN", 
                      "GT", "LT", "BANG", "TILDE", "QUESTION", "COLON", 
                      "EQUAL", "LE", "GE", "NOTEQUAL", "AND", "OR", "INC", 
                      "DEC", "ADD", "SUB", "MUL", "DIV", "BITAND", "BITOR", 
                      "CARET", "MOD", "SHIFT_R", "SHIFT_L", "ADD_ASSIGN", 
                      "SUB_ASSIGN", "MUL_ASSIGN", "DIV_ASSIGN", "AND_ASSIGN", 
                      "OR_ASSIGN", "XOR_ASSIGN", "MOD_ASSIGN", "LSHIFT_ASSIGN", 
                      "RSHIFT_ASSIGN", "ELIPSIS", "ASSIGNPA", "GETTER", 
                      "NONATOMIC", "SETTER", "STRONG", "RETAIN", "READONLY", 
                      "READWRITE", "WEAK", "IDENTIFIER", "CHARACTER_LITERAL", 
                      "STRING_LITERAL", "HEX_LITERAL", "DECIMAL_LITERAL", 
                      "OCTAL_LITERAL", "FLOATING_POINT_LITERAL", "IMPORT", 
                      "INCLUDE", "PRAGMA", "WS", "COMMENT", "LINE_COMMENT", 
                      "HDEFINE", "HIF", "HELSE", "HUNDEF", "HIFNDEF", "HENDIF" ];

var ruleNames =  [ "translation_unit", "external_declaration", "preprocessor_declaration", 
                   "class_interface", "category_interface", "class_implementation", 
                   "category_implementation", "protocol_declaration", "protocol_declaration_list", 
                   "class_declaration_list", "class_list", "protocol_reference_list", 
                   "protocol_list", "property_declaration", "property_attributes_declaration", 
                   "property_attributes_list", "property_attribute", "class_name", 
                   "superclass_name", "category_name", "protocol_name", 
                   "instance_variables", "visibility_specification", "interface_declaration_list", 
                   "class_method_declaration", "instance_method_declaration", 
                   "method_declaration", "implementation_definition_list", 
                   "class_method_definition", "instance_method_definition", 
                   "method_definition", "method_selector", "keyword_declarator", 
                   "selector", "method_type", "property_implementation", 
                   "property_synthesize_list", "property_synthesize_item", 
                   "block_type", "type_specifier", "type_qualifier", "protocol_qualifier", 
                   "primary_expression", "dictionary_pair", "dictionary_expression", 
                   "array_expression", "box_expression", "block_parameters", 
                   "block_expression", "message_expression", "receiver", 
                   "message_selector", "keyword_argument", "selector_expression", 
                   "selector_name", "protocol_expression", "encode_expression", 
                   "type_variable_declarator", "try_statement", "catch_statement", 
                   "finally_statement", "throw_statement", "try_block", 
                   "synchronized_statement", "autorelease_statement", "function_definition", 
                   "declaration", "declaration_specifiers", "arc_behaviour_specifier", 
                   "storage_class_specifier", "init_declarator_list", "init_declarator", 
                   "struct_or_union_specifier", "struct_declaration", "specifier_qualifier_list", 
                   "struct_declarator_list", "struct_declarator", "enum_specifier", 
                   "enumerator_list", "enumerator", "pointer", "declarator", 
                   "direct_declarator", "declarator_suffix", "parameter_list", 
                   "parameter_declaration", "initializer", "type_name", 
                   "abstract_declarator", "abstract_declarator_suffix", 
                   "parameter_declaration_list", "statement_list", "statement", 
                   "labeled_statement", "compound_statement", "selection_statement", 
                   "for_in_statement", "for_statement", "while_statement", 
                   "do_statement", "iteration_statement", "jump_statement", 
                   "expression", "assignment_expression", "assignment_operator", 
                   "conditional_expression", "constant_expression", "logical_or_expression", 
                   "logical_and_expression", "inclusive_or_expression", 
                   "exclusive_or_expression", "and_expression", "equality_expression", 
                   "relational_expression", "shift_expression", "additive_expression", 
                   "multiplicative_expression", "cast_expression", "unary_expression", 
                   "unary_operator", "postfix_expression", "argument_expression_list", 
                   "identifier", "constant" ];

function ObjCParser (input) {
	antlr4.Parser.call(this, input);
    this._interp = new antlr4.atn.ParserATNSimulator(this, atn, decisionsToDFA, sharedContextCache);
    this.ruleNames = ruleNames;
    this.literalNames = literalNames;
    this.symbolicNames = symbolicNames;
    return this;
}

ObjCParser.prototype = Object.create(antlr4.Parser.prototype);
ObjCParser.prototype.constructor = ObjCParser;

Object.defineProperty(ObjCParser.prototype, "atn", {
	get : function() {
		return atn;
	}
});

ObjCParser.EOF = antlr4.Token.EOF;
ObjCParser.AUTORELEASEPOOL = 1;
ObjCParser.CATCH = 2;
ObjCParser.CLASS = 3;
ObjCParser.DYNAMIC = 4;
ObjCParser.ENCODE = 5;
ObjCParser.END = 6;
ObjCParser.FINALLY = 7;
ObjCParser.IMPLEMENTATION = 8;
ObjCParser.INTERFACE = 9;
ObjCParser.PACKAGE = 10;
ObjCParser.PROTOCOL = 11;
ObjCParser.OPTIONAL = 12;
ObjCParser.PRIVATE = 13;
ObjCParser.PROPERTY = 14;
ObjCParser.PROTECTED = 15;
ObjCParser.PUBLIC = 16;
ObjCParser.SELECTOR = 17;
ObjCParser.SYNCHRONIZED = 18;
ObjCParser.SYNTHESIZE = 19;
ObjCParser.THROW = 20;
ObjCParser.TRY = 21;
ObjCParser.SUPER = 22;
ObjCParser.SELF = 23;
ObjCParser.ABSTRACT = 24;
ObjCParser.AUTO = 25;
ObjCParser.BOOLEAN = 26;
ObjCParser.BREAK = 27;
ObjCParser.BYCOPY = 28;
ObjCParser.BYREF = 29;
ObjCParser.CASE = 30;
ObjCParser.CHAR = 31;
ObjCParser.CONST = 32;
ObjCParser.CONTINUE = 33;
ObjCParser.DEFAULT = 34;
ObjCParser.DO = 35;
ObjCParser.DOUBLE = 36;
ObjCParser.ELSE = 37;
ObjCParser.ENUM = 38;
ObjCParser.EXTERN = 39;
ObjCParser.FLOAT = 40;
ObjCParser.FOR = 41;
ObjCParser.ID = 42;
ObjCParser.IF = 43;
ObjCParser.IN = 44;
ObjCParser.INOUT = 45;
ObjCParser.GOTO = 46;
ObjCParser.INT = 47;
ObjCParser.LONG = 48;
ObjCParser.ONEWAY = 49;
ObjCParser.OUT = 50;
ObjCParser.REGISTER = 51;
ObjCParser.RETURN = 52;
ObjCParser.SHORT = 53;
ObjCParser.SIGNED = 54;
ObjCParser.SIZEOF = 55;
ObjCParser.STATIC = 56;
ObjCParser.STRUCT = 57;
ObjCParser.SWITCH = 58;
ObjCParser.TYPEDEF = 59;
ObjCParser.UNION = 60;
ObjCParser.UNSIGNED = 61;
ObjCParser.VOID = 62;
ObjCParser.VOLATILE = 63;
ObjCParser.WHILE = 64;
ObjCParser.NS_OPTIONS = 65;
ObjCParser.NS_ENUM = 66;
ObjCParser.WWEAK = 67;
ObjCParser.WUNSAFE_UNRETAINED = 68;
ObjCParser.LPAREN = 69;
ObjCParser.RPAREN = 70;
ObjCParser.LBRACE = 71;
ObjCParser.RBRACE = 72;
ObjCParser.LBRACK = 73;
ObjCParser.RBRACK = 74;
ObjCParser.SEMI = 75;
ObjCParser.COMMA = 76;
ObjCParser.DOT = 77;
ObjCParser.STRUCTACCESS = 78;
ObjCParser.AT = 79;
ObjCParser.ASSIGN = 80;
ObjCParser.GT = 81;
ObjCParser.LT = 82;
ObjCParser.BANG = 83;
ObjCParser.TILDE = 84;
ObjCParser.QUESTION = 85;
ObjCParser.COLON = 86;
ObjCParser.EQUAL = 87;
ObjCParser.LE = 88;
ObjCParser.GE = 89;
ObjCParser.NOTEQUAL = 90;
ObjCParser.AND = 91;
ObjCParser.OR = 92;
ObjCParser.INC = 93;
ObjCParser.DEC = 94;
ObjCParser.ADD = 95;
ObjCParser.SUB = 96;
ObjCParser.MUL = 97;
ObjCParser.DIV = 98;
ObjCParser.BITAND = 99;
ObjCParser.BITOR = 100;
ObjCParser.CARET = 101;
ObjCParser.MOD = 102;
ObjCParser.SHIFT_R = 103;
ObjCParser.SHIFT_L = 104;
ObjCParser.ADD_ASSIGN = 105;
ObjCParser.SUB_ASSIGN = 106;
ObjCParser.MUL_ASSIGN = 107;
ObjCParser.DIV_ASSIGN = 108;
ObjCParser.AND_ASSIGN = 109;
ObjCParser.OR_ASSIGN = 110;
ObjCParser.XOR_ASSIGN = 111;
ObjCParser.MOD_ASSIGN = 112;
ObjCParser.LSHIFT_ASSIGN = 113;
ObjCParser.RSHIFT_ASSIGN = 114;
ObjCParser.ELIPSIS = 115;
ObjCParser.ASSIGNPA = 116;
ObjCParser.GETTER = 117;
ObjCParser.NONATOMIC = 118;
ObjCParser.SETTER = 119;
ObjCParser.STRONG = 120;
ObjCParser.RETAIN = 121;
ObjCParser.READONLY = 122;
ObjCParser.READWRITE = 123;
ObjCParser.WEAK = 124;
ObjCParser.IDENTIFIER = 125;
ObjCParser.CHARACTER_LITERAL = 126;
ObjCParser.STRING_LITERAL = 127;
ObjCParser.HEX_LITERAL = 128;
ObjCParser.DECIMAL_LITERAL = 129;
ObjCParser.OCTAL_LITERAL = 130;
ObjCParser.FLOATING_POINT_LITERAL = 131;
ObjCParser.IMPORT = 132;
ObjCParser.INCLUDE = 133;
ObjCParser.PRAGMA = 134;
ObjCParser.WS = 135;
ObjCParser.COMMENT = 136;
ObjCParser.LINE_COMMENT = 137;
ObjCParser.HDEFINE = 138;
ObjCParser.HIF = 139;
ObjCParser.HELSE = 140;
ObjCParser.HUNDEF = 141;
ObjCParser.HIFNDEF = 142;
ObjCParser.HENDIF = 143;

ObjCParser.RULE_translation_unit = 0;
ObjCParser.RULE_external_declaration = 1;
ObjCParser.RULE_preprocessor_declaration = 2;
ObjCParser.RULE_class_interface = 3;
ObjCParser.RULE_category_interface = 4;
ObjCParser.RULE_class_implementation = 5;
ObjCParser.RULE_category_implementation = 6;
ObjCParser.RULE_protocol_declaration = 7;
ObjCParser.RULE_protocol_declaration_list = 8;
ObjCParser.RULE_class_declaration_list = 9;
ObjCParser.RULE_class_list = 10;
ObjCParser.RULE_protocol_reference_list = 11;
ObjCParser.RULE_protocol_list = 12;
ObjCParser.RULE_property_declaration = 13;
ObjCParser.RULE_property_attributes_declaration = 14;
ObjCParser.RULE_property_attributes_list = 15;
ObjCParser.RULE_property_attribute = 16;
ObjCParser.RULE_class_name = 17;
ObjCParser.RULE_superclass_name = 18;
ObjCParser.RULE_category_name = 19;
ObjCParser.RULE_protocol_name = 20;
ObjCParser.RULE_instance_variables = 21;
ObjCParser.RULE_visibility_specification = 22;
ObjCParser.RULE_interface_declaration_list = 23;
ObjCParser.RULE_class_method_declaration = 24;
ObjCParser.RULE_instance_method_declaration = 25;
ObjCParser.RULE_method_declaration = 26;
ObjCParser.RULE_implementation_definition_list = 27;
ObjCParser.RULE_class_method_definition = 28;
ObjCParser.RULE_instance_method_definition = 29;
ObjCParser.RULE_method_definition = 30;
ObjCParser.RULE_method_selector = 31;
ObjCParser.RULE_keyword_declarator = 32;
ObjCParser.RULE_selector = 33;
ObjCParser.RULE_method_type = 34;
ObjCParser.RULE_property_implementation = 35;
ObjCParser.RULE_property_synthesize_list = 36;
ObjCParser.RULE_property_synthesize_item = 37;
ObjCParser.RULE_block_type = 38;
ObjCParser.RULE_type_specifier = 39;
ObjCParser.RULE_type_qualifier = 40;
ObjCParser.RULE_protocol_qualifier = 41;
ObjCParser.RULE_primary_expression = 42;
ObjCParser.RULE_dictionary_pair = 43;
ObjCParser.RULE_dictionary_expression = 44;
ObjCParser.RULE_array_expression = 45;
ObjCParser.RULE_box_expression = 46;
ObjCParser.RULE_block_parameters = 47;
ObjCParser.RULE_block_expression = 48;
ObjCParser.RULE_message_expression = 49;
ObjCParser.RULE_receiver = 50;
ObjCParser.RULE_message_selector = 51;
ObjCParser.RULE_keyword_argument = 52;
ObjCParser.RULE_selector_expression = 53;
ObjCParser.RULE_selector_name = 54;
ObjCParser.RULE_protocol_expression = 55;
ObjCParser.RULE_encode_expression = 56;
ObjCParser.RULE_type_variable_declarator = 57;
ObjCParser.RULE_try_statement = 58;
ObjCParser.RULE_catch_statement = 59;
ObjCParser.RULE_finally_statement = 60;
ObjCParser.RULE_throw_statement = 61;
ObjCParser.RULE_try_block = 62;
ObjCParser.RULE_synchronized_statement = 63;
ObjCParser.RULE_autorelease_statement = 64;
ObjCParser.RULE_function_definition = 65;
ObjCParser.RULE_declaration = 66;
ObjCParser.RULE_declaration_specifiers = 67;
ObjCParser.RULE_arc_behaviour_specifier = 68;
ObjCParser.RULE_storage_class_specifier = 69;
ObjCParser.RULE_init_declarator_list = 70;
ObjCParser.RULE_init_declarator = 71;
ObjCParser.RULE_struct_or_union_specifier = 72;
ObjCParser.RULE_struct_declaration = 73;
ObjCParser.RULE_specifier_qualifier_list = 74;
ObjCParser.RULE_struct_declarator_list = 75;
ObjCParser.RULE_struct_declarator = 76;
ObjCParser.RULE_enum_specifier = 77;
ObjCParser.RULE_enumerator_list = 78;
ObjCParser.RULE_enumerator = 79;
ObjCParser.RULE_pointer = 80;
ObjCParser.RULE_declarator = 81;
ObjCParser.RULE_direct_declarator = 82;
ObjCParser.RULE_declarator_suffix = 83;
ObjCParser.RULE_parameter_list = 84;
ObjCParser.RULE_parameter_declaration = 85;
ObjCParser.RULE_initializer = 86;
ObjCParser.RULE_type_name = 87;
ObjCParser.RULE_abstract_declarator = 88;
ObjCParser.RULE_abstract_declarator_suffix = 89;
ObjCParser.RULE_parameter_declaration_list = 90;
ObjCParser.RULE_statement_list = 91;
ObjCParser.RULE_statement = 92;
ObjCParser.RULE_labeled_statement = 93;
ObjCParser.RULE_compound_statement = 94;
ObjCParser.RULE_selection_statement = 95;
ObjCParser.RULE_for_in_statement = 96;
ObjCParser.RULE_for_statement = 97;
ObjCParser.RULE_while_statement = 98;
ObjCParser.RULE_do_statement = 99;
ObjCParser.RULE_iteration_statement = 100;
ObjCParser.RULE_jump_statement = 101;
ObjCParser.RULE_expression = 102;
ObjCParser.RULE_assignment_expression = 103;
ObjCParser.RULE_assignment_operator = 104;
ObjCParser.RULE_conditional_expression = 105;
ObjCParser.RULE_constant_expression = 106;
ObjCParser.RULE_logical_or_expression = 107;
ObjCParser.RULE_logical_and_expression = 108;
ObjCParser.RULE_inclusive_or_expression = 109;
ObjCParser.RULE_exclusive_or_expression = 110;
ObjCParser.RULE_and_expression = 111;
ObjCParser.RULE_equality_expression = 112;
ObjCParser.RULE_relational_expression = 113;
ObjCParser.RULE_shift_expression = 114;
ObjCParser.RULE_additive_expression = 115;
ObjCParser.RULE_multiplicative_expression = 116;
ObjCParser.RULE_cast_expression = 117;
ObjCParser.RULE_unary_expression = 118;
ObjCParser.RULE_unary_operator = 119;
ObjCParser.RULE_postfix_expression = 120;
ObjCParser.RULE_argument_expression_list = 121;
ObjCParser.RULE_identifier = 122;
ObjCParser.RULE_constant = 123;

function Translation_unitContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_translation_unit;
    return this;
}

Translation_unitContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Translation_unitContext.prototype.constructor = Translation_unitContext;

Translation_unitContext.prototype.EOF = function() {
    return this.getToken(ObjCParser.EOF, 0);
};

Translation_unitContext.prototype.external_declaration = function(i) {
    if(i===undefined) {
        i = null;
    }
    if(i===null) {
        return this.getTypedRuleContexts(External_declarationContext);
    } else {
        return this.getTypedRuleContext(External_declarationContext,i);
    }
};

Translation_unitContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterTranslation_unit(this);
	}
};

Translation_unitContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitTranslation_unit(this);
	}
};




ObjCParser.Translation_unitContext = Translation_unitContext;

ObjCParser.prototype.translation_unit = function() {

    var localctx = new Translation_unitContext(this, this._ctx, this.state);
    this.enterRule(localctx, 0, ObjCParser.RULE_translation_unit);
    var _la = 0; // Token type
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 249; 
        this._errHandler.sync(this);
        _la = this._input.LA(1);
        do {
            this.state = 248;
            this.external_declaration();
            this.state = 251; 
            this._errHandler.sync(this);
            _la = this._input.LA(1);
        } while(((((_la - 3)) & ~0x1f) == 0 && ((1 << (_la - 3)) & ((1 << (ObjCParser.CLASS - 3)) | (1 << (ObjCParser.IMPLEMENTATION - 3)) | (1 << (ObjCParser.INTERFACE - 3)) | (1 << (ObjCParser.PROTOCOL - 3)) | (1 << (ObjCParser.AUTO - 3)) | (1 << (ObjCParser.BYCOPY - 3)) | (1 << (ObjCParser.BYREF - 3)) | (1 << (ObjCParser.CHAR - 3)) | (1 << (ObjCParser.CONST - 3)))) !== 0) || ((((_la - 36)) & ~0x1f) == 0 && ((1 << (_la - 36)) & ((1 << (ObjCParser.DOUBLE - 36)) | (1 << (ObjCParser.ENUM - 36)) | (1 << (ObjCParser.EXTERN - 36)) | (1 << (ObjCParser.FLOAT - 36)) | (1 << (ObjCParser.ID - 36)) | (1 << (ObjCParser.IN - 36)) | (1 << (ObjCParser.INOUT - 36)) | (1 << (ObjCParser.INT - 36)) | (1 << (ObjCParser.LONG - 36)) | (1 << (ObjCParser.ONEWAY - 36)) | (1 << (ObjCParser.OUT - 36)) | (1 << (ObjCParser.REGISTER - 36)) | (1 << (ObjCParser.SHORT - 36)) | (1 << (ObjCParser.SIGNED - 36)) | (1 << (ObjCParser.STATIC - 36)) | (1 << (ObjCParser.STRUCT - 36)) | (1 << (ObjCParser.TYPEDEF - 36)) | (1 << (ObjCParser.UNION - 36)) | (1 << (ObjCParser.UNSIGNED - 36)) | (1 << (ObjCParser.VOID - 36)) | (1 << (ObjCParser.VOLATILE - 36)) | (1 << (ObjCParser.NS_OPTIONS - 36)) | (1 << (ObjCParser.NS_ENUM - 36)) | (1 << (ObjCParser.WWEAK - 36)))) !== 0) || ((((_la - 68)) & ~0x1f) == 0 && ((1 << (_la - 68)) & ((1 << (ObjCParser.WUNSAFE_UNRETAINED - 68)) | (1 << (ObjCParser.LPAREN - 68)) | (1 << (ObjCParser.MUL - 68)))) !== 0) || ((((_la - 125)) & ~0x1f) == 0 && ((1 << (_la - 125)) & ((1 << (ObjCParser.IDENTIFIER - 125)) | (1 << (ObjCParser.IMPORT - 125)) | (1 << (ObjCParser.INCLUDE - 125)) | (1 << (ObjCParser.COMMENT - 125)) | (1 << (ObjCParser.LINE_COMMENT - 125)))) !== 0));
        this.state = 253;
        this.match(ObjCParser.EOF);
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function External_declarationContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_external_declaration;
    return this;
}

External_declarationContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
External_declarationContext.prototype.constructor = External_declarationContext;

External_declarationContext.prototype.COMMENT = function() {
    return this.getToken(ObjCParser.COMMENT, 0);
};

External_declarationContext.prototype.LINE_COMMENT = function() {
    return this.getToken(ObjCParser.LINE_COMMENT, 0);
};

External_declarationContext.prototype.preprocessor_declaration = function() {
    return this.getTypedRuleContext(Preprocessor_declarationContext,0);
};

External_declarationContext.prototype.function_definition = function() {
    return this.getTypedRuleContext(Function_definitionContext,0);
};

External_declarationContext.prototype.declaration = function() {
    return this.getTypedRuleContext(DeclarationContext,0);
};

External_declarationContext.prototype.class_interface = function() {
    return this.getTypedRuleContext(Class_interfaceContext,0);
};

External_declarationContext.prototype.class_implementation = function() {
    return this.getTypedRuleContext(Class_implementationContext,0);
};

External_declarationContext.prototype.category_interface = function() {
    return this.getTypedRuleContext(Category_interfaceContext,0);
};

External_declarationContext.prototype.category_implementation = function() {
    return this.getTypedRuleContext(Category_implementationContext,0);
};

External_declarationContext.prototype.protocol_declaration = function() {
    return this.getTypedRuleContext(Protocol_declarationContext,0);
};

External_declarationContext.prototype.protocol_declaration_list = function() {
    return this.getTypedRuleContext(Protocol_declaration_listContext,0);
};

External_declarationContext.prototype.class_declaration_list = function() {
    return this.getTypedRuleContext(Class_declaration_listContext,0);
};

External_declarationContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterExternal_declaration(this);
	}
};

External_declarationContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitExternal_declaration(this);
	}
};




ObjCParser.External_declarationContext = External_declarationContext;

ObjCParser.prototype.external_declaration = function() {

    var localctx = new External_declarationContext(this, this._ctx, this.state);
    this.enterRule(localctx, 2, ObjCParser.RULE_external_declaration);
    try {
        this.state = 267;
        var la_ = this._interp.adaptivePredict(this._input,1,this._ctx);
        switch(la_) {
        case 1:
            this.enterOuterAlt(localctx, 1);
            this.state = 255;
            this.match(ObjCParser.COMMENT);
            break;

        case 2:
            this.enterOuterAlt(localctx, 2);
            this.state = 256;
            this.match(ObjCParser.LINE_COMMENT);
            break;

        case 3:
            this.enterOuterAlt(localctx, 3);
            this.state = 257;
            this.preprocessor_declaration();
            break;

        case 4:
            this.enterOuterAlt(localctx, 4);
            this.state = 258;
            this.function_definition();
            break;

        case 5:
            this.enterOuterAlt(localctx, 5);
            this.state = 259;
            this.declaration();
            break;

        case 6:
            this.enterOuterAlt(localctx, 6);
            this.state = 260;
            this.class_interface();
            break;

        case 7:
            this.enterOuterAlt(localctx, 7);
            this.state = 261;
            this.class_implementation();
            break;

        case 8:
            this.enterOuterAlt(localctx, 8);
            this.state = 262;
            this.category_interface();
            break;

        case 9:
            this.enterOuterAlt(localctx, 9);
            this.state = 263;
            this.category_implementation();
            break;

        case 10:
            this.enterOuterAlt(localctx, 10);
            this.state = 264;
            this.protocol_declaration();
            break;

        case 11:
            this.enterOuterAlt(localctx, 11);
            this.state = 265;
            this.protocol_declaration_list();
            break;

        case 12:
            this.enterOuterAlt(localctx, 12);
            this.state = 266;
            this.class_declaration_list();
            break;

        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Preprocessor_declarationContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_preprocessor_declaration;
    return this;
}

Preprocessor_declarationContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Preprocessor_declarationContext.prototype.constructor = Preprocessor_declarationContext;

Preprocessor_declarationContext.prototype.IMPORT = function() {
    return this.getToken(ObjCParser.IMPORT, 0);
};

Preprocessor_declarationContext.prototype.INCLUDE = function() {
    return this.getToken(ObjCParser.INCLUDE, 0);
};

Preprocessor_declarationContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterPreprocessor_declaration(this);
	}
};

Preprocessor_declarationContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitPreprocessor_declaration(this);
	}
};




ObjCParser.Preprocessor_declarationContext = Preprocessor_declarationContext;

ObjCParser.prototype.preprocessor_declaration = function() {

    var localctx = new Preprocessor_declarationContext(this, this._ctx, this.state);
    this.enterRule(localctx, 4, ObjCParser.RULE_preprocessor_declaration);
    var _la = 0; // Token type
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 269;
        _la = this._input.LA(1);
        if(!(_la===ObjCParser.IMPORT || _la===ObjCParser.INCLUDE)) {
        this._errHandler.recoverInline(this);
        }
        else {
            this.consume();
        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Class_interfaceContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_class_interface;
    return this;
}

Class_interfaceContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Class_interfaceContext.prototype.constructor = Class_interfaceContext;

Class_interfaceContext.prototype.class_name = function() {
    return this.getTypedRuleContext(Class_nameContext,0);
};

Class_interfaceContext.prototype.superclass_name = function() {
    return this.getTypedRuleContext(Superclass_nameContext,0);
};

Class_interfaceContext.prototype.protocol_reference_list = function() {
    return this.getTypedRuleContext(Protocol_reference_listContext,0);
};

Class_interfaceContext.prototype.instance_variables = function() {
    return this.getTypedRuleContext(Instance_variablesContext,0);
};

Class_interfaceContext.prototype.interface_declaration_list = function() {
    return this.getTypedRuleContext(Interface_declaration_listContext,0);
};

Class_interfaceContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterClass_interface(this);
	}
};

Class_interfaceContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitClass_interface(this);
	}
};




ObjCParser.Class_interfaceContext = Class_interfaceContext;

ObjCParser.prototype.class_interface = function() {

    var localctx = new Class_interfaceContext(this, this._ctx, this.state);
    this.enterRule(localctx, 6, ObjCParser.RULE_class_interface);
    var _la = 0; // Token type
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 271;
        this.match(ObjCParser.INTERFACE);
        this.state = 272;
        this.class_name();
        this.state = 275;
        _la = this._input.LA(1);
        if(_la===ObjCParser.COLON) {
            this.state = 273;
            this.match(ObjCParser.COLON);
            this.state = 274;
            this.superclass_name();
        }

        this.state = 278;
        _la = this._input.LA(1);
        if(_la===ObjCParser.LT) {
            this.state = 277;
            this.protocol_reference_list();
        }

        this.state = 281;
        _la = this._input.LA(1);
        if(_la===ObjCParser.LBRACE) {
            this.state = 280;
            this.instance_variables();
        }

        this.state = 284;
        _la = this._input.LA(1);
        if(((((_la - 14)) & ~0x1f) == 0 && ((1 << (_la - 14)) & ((1 << (ObjCParser.PROPERTY - 14)) | (1 << (ObjCParser.AUTO - 14)) | (1 << (ObjCParser.BYCOPY - 14)) | (1 << (ObjCParser.BYREF - 14)) | (1 << (ObjCParser.CHAR - 14)) | (1 << (ObjCParser.CONST - 14)) | (1 << (ObjCParser.DOUBLE - 14)) | (1 << (ObjCParser.ENUM - 14)) | (1 << (ObjCParser.EXTERN - 14)) | (1 << (ObjCParser.FLOAT - 14)) | (1 << (ObjCParser.ID - 14)) | (1 << (ObjCParser.IN - 14)) | (1 << (ObjCParser.INOUT - 14)))) !== 0) || ((((_la - 47)) & ~0x1f) == 0 && ((1 << (_la - 47)) & ((1 << (ObjCParser.INT - 47)) | (1 << (ObjCParser.LONG - 47)) | (1 << (ObjCParser.ONEWAY - 47)) | (1 << (ObjCParser.OUT - 47)) | (1 << (ObjCParser.REGISTER - 47)) | (1 << (ObjCParser.SHORT - 47)) | (1 << (ObjCParser.SIGNED - 47)) | (1 << (ObjCParser.STATIC - 47)) | (1 << (ObjCParser.STRUCT - 47)) | (1 << (ObjCParser.TYPEDEF - 47)) | (1 << (ObjCParser.UNION - 47)) | (1 << (ObjCParser.UNSIGNED - 47)) | (1 << (ObjCParser.VOID - 47)) | (1 << (ObjCParser.VOLATILE - 47)) | (1 << (ObjCParser.NS_OPTIONS - 47)) | (1 << (ObjCParser.NS_ENUM - 47)) | (1 << (ObjCParser.WWEAK - 47)) | (1 << (ObjCParser.WUNSAFE_UNRETAINED - 47)))) !== 0) || ((((_la - 95)) & ~0x1f) == 0 && ((1 << (_la - 95)) & ((1 << (ObjCParser.ADD - 95)) | (1 << (ObjCParser.SUB - 95)) | (1 << (ObjCParser.IDENTIFIER - 95)))) !== 0)) {
            this.state = 283;
            this.interface_declaration_list();
        }

        this.state = 286;
        this.match(ObjCParser.END);
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Category_interfaceContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_category_interface;
    return this;
}

Category_interfaceContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Category_interfaceContext.prototype.constructor = Category_interfaceContext;

Category_interfaceContext.prototype.class_name = function() {
    return this.getTypedRuleContext(Class_nameContext,0);
};

Category_interfaceContext.prototype.category_name = function() {
    return this.getTypedRuleContext(Category_nameContext,0);
};

Category_interfaceContext.prototype.protocol_reference_list = function() {
    return this.getTypedRuleContext(Protocol_reference_listContext,0);
};

Category_interfaceContext.prototype.instance_variables = function() {
    return this.getTypedRuleContext(Instance_variablesContext,0);
};

Category_interfaceContext.prototype.interface_declaration_list = function() {
    return this.getTypedRuleContext(Interface_declaration_listContext,0);
};

Category_interfaceContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterCategory_interface(this);
	}
};

Category_interfaceContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitCategory_interface(this);
	}
};




ObjCParser.Category_interfaceContext = Category_interfaceContext;

ObjCParser.prototype.category_interface = function() {

    var localctx = new Category_interfaceContext(this, this._ctx, this.state);
    this.enterRule(localctx, 8, ObjCParser.RULE_category_interface);
    var _la = 0; // Token type
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 288;
        this.match(ObjCParser.INTERFACE);
        this.state = 289;
        this.class_name();
        this.state = 290;
        this.match(ObjCParser.LPAREN);
        this.state = 292;
        _la = this._input.LA(1);
        if(_la===ObjCParser.IDENTIFIER) {
            this.state = 291;
            this.category_name();
        }

        this.state = 294;
        this.match(ObjCParser.RPAREN);
        this.state = 296;
        _la = this._input.LA(1);
        if(_la===ObjCParser.LT) {
            this.state = 295;
            this.protocol_reference_list();
        }

        this.state = 299;
        _la = this._input.LA(1);
        if(_la===ObjCParser.LBRACE) {
            this.state = 298;
            this.instance_variables();
        }

        this.state = 302;
        _la = this._input.LA(1);
        if(((((_la - 14)) & ~0x1f) == 0 && ((1 << (_la - 14)) & ((1 << (ObjCParser.PROPERTY - 14)) | (1 << (ObjCParser.AUTO - 14)) | (1 << (ObjCParser.BYCOPY - 14)) | (1 << (ObjCParser.BYREF - 14)) | (1 << (ObjCParser.CHAR - 14)) | (1 << (ObjCParser.CONST - 14)) | (1 << (ObjCParser.DOUBLE - 14)) | (1 << (ObjCParser.ENUM - 14)) | (1 << (ObjCParser.EXTERN - 14)) | (1 << (ObjCParser.FLOAT - 14)) | (1 << (ObjCParser.ID - 14)) | (1 << (ObjCParser.IN - 14)) | (1 << (ObjCParser.INOUT - 14)))) !== 0) || ((((_la - 47)) & ~0x1f) == 0 && ((1 << (_la - 47)) & ((1 << (ObjCParser.INT - 47)) | (1 << (ObjCParser.LONG - 47)) | (1 << (ObjCParser.ONEWAY - 47)) | (1 << (ObjCParser.OUT - 47)) | (1 << (ObjCParser.REGISTER - 47)) | (1 << (ObjCParser.SHORT - 47)) | (1 << (ObjCParser.SIGNED - 47)) | (1 << (ObjCParser.STATIC - 47)) | (1 << (ObjCParser.STRUCT - 47)) | (1 << (ObjCParser.TYPEDEF - 47)) | (1 << (ObjCParser.UNION - 47)) | (1 << (ObjCParser.UNSIGNED - 47)) | (1 << (ObjCParser.VOID - 47)) | (1 << (ObjCParser.VOLATILE - 47)) | (1 << (ObjCParser.NS_OPTIONS - 47)) | (1 << (ObjCParser.NS_ENUM - 47)) | (1 << (ObjCParser.WWEAK - 47)) | (1 << (ObjCParser.WUNSAFE_UNRETAINED - 47)))) !== 0) || ((((_la - 95)) & ~0x1f) == 0 && ((1 << (_la - 95)) & ((1 << (ObjCParser.ADD - 95)) | (1 << (ObjCParser.SUB - 95)) | (1 << (ObjCParser.IDENTIFIER - 95)))) !== 0)) {
            this.state = 301;
            this.interface_declaration_list();
        }

        this.state = 304;
        this.match(ObjCParser.END);
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Class_implementationContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_class_implementation;
    return this;
}

Class_implementationContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Class_implementationContext.prototype.constructor = Class_implementationContext;

Class_implementationContext.prototype.class_name = function() {
    return this.getTypedRuleContext(Class_nameContext,0);
};

Class_implementationContext.prototype.superclass_name = function() {
    return this.getTypedRuleContext(Superclass_nameContext,0);
};

Class_implementationContext.prototype.instance_variables = function() {
    return this.getTypedRuleContext(Instance_variablesContext,0);
};

Class_implementationContext.prototype.implementation_definition_list = function() {
    return this.getTypedRuleContext(Implementation_definition_listContext,0);
};

Class_implementationContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterClass_implementation(this);
	}
};

Class_implementationContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitClass_implementation(this);
	}
};




ObjCParser.Class_implementationContext = Class_implementationContext;

ObjCParser.prototype.class_implementation = function() {

    var localctx = new Class_implementationContext(this, this._ctx, this.state);
    this.enterRule(localctx, 10, ObjCParser.RULE_class_implementation);
    var _la = 0; // Token type
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 306;
        this.match(ObjCParser.IMPLEMENTATION);

        this.state = 307;
        this.class_name();
        this.state = 310;
        _la = this._input.LA(1);
        if(_la===ObjCParser.COLON) {
            this.state = 308;
            this.match(ObjCParser.COLON);
            this.state = 309;
            this.superclass_name();
        }

        this.state = 313;
        _la = this._input.LA(1);
        if(_la===ObjCParser.LBRACE) {
            this.state = 312;
            this.instance_variables();
        }

        this.state = 316;
        _la = this._input.LA(1);
        if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << ObjCParser.DYNAMIC) | (1 << ObjCParser.SYNTHESIZE) | (1 << ObjCParser.AUTO) | (1 << ObjCParser.BYCOPY) | (1 << ObjCParser.BYREF) | (1 << ObjCParser.CHAR))) !== 0) || ((((_la - 32)) & ~0x1f) == 0 && ((1 << (_la - 32)) & ((1 << (ObjCParser.CONST - 32)) | (1 << (ObjCParser.DOUBLE - 32)) | (1 << (ObjCParser.ENUM - 32)) | (1 << (ObjCParser.EXTERN - 32)) | (1 << (ObjCParser.FLOAT - 32)) | (1 << (ObjCParser.ID - 32)) | (1 << (ObjCParser.IN - 32)) | (1 << (ObjCParser.INOUT - 32)) | (1 << (ObjCParser.INT - 32)) | (1 << (ObjCParser.LONG - 32)) | (1 << (ObjCParser.ONEWAY - 32)) | (1 << (ObjCParser.OUT - 32)) | (1 << (ObjCParser.REGISTER - 32)) | (1 << (ObjCParser.SHORT - 32)) | (1 << (ObjCParser.SIGNED - 32)) | (1 << (ObjCParser.STATIC - 32)) | (1 << (ObjCParser.STRUCT - 32)) | (1 << (ObjCParser.TYPEDEF - 32)) | (1 << (ObjCParser.UNION - 32)) | (1 << (ObjCParser.UNSIGNED - 32)) | (1 << (ObjCParser.VOID - 32)) | (1 << (ObjCParser.VOLATILE - 32)))) !== 0) || ((((_la - 65)) & ~0x1f) == 0 && ((1 << (_la - 65)) & ((1 << (ObjCParser.NS_OPTIONS - 65)) | (1 << (ObjCParser.NS_ENUM - 65)) | (1 << (ObjCParser.WWEAK - 65)) | (1 << (ObjCParser.WUNSAFE_UNRETAINED - 65)) | (1 << (ObjCParser.LPAREN - 65)) | (1 << (ObjCParser.ADD - 65)) | (1 << (ObjCParser.SUB - 65)))) !== 0) || _la===ObjCParser.MUL || _la===ObjCParser.IDENTIFIER) {
            this.state = 315;
            this.implementation_definition_list();
        }

        this.state = 318;
        this.match(ObjCParser.END);
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Category_implementationContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_category_implementation;
    return this;
}

Category_implementationContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Category_implementationContext.prototype.constructor = Category_implementationContext;

Category_implementationContext.prototype.class_name = function() {
    return this.getTypedRuleContext(Class_nameContext,0);
};

Category_implementationContext.prototype.category_name = function() {
    return this.getTypedRuleContext(Category_nameContext,0);
};

Category_implementationContext.prototype.implementation_definition_list = function() {
    return this.getTypedRuleContext(Implementation_definition_listContext,0);
};

Category_implementationContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterCategory_implementation(this);
	}
};

Category_implementationContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitCategory_implementation(this);
	}
};




ObjCParser.Category_implementationContext = Category_implementationContext;

ObjCParser.prototype.category_implementation = function() {

    var localctx = new Category_implementationContext(this, this._ctx, this.state);
    this.enterRule(localctx, 12, ObjCParser.RULE_category_implementation);
    var _la = 0; // Token type
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 320;
        this.match(ObjCParser.IMPLEMENTATION);

        this.state = 321;
        this.class_name();
        this.state = 322;
        this.match(ObjCParser.LPAREN);
        this.state = 323;
        this.category_name();
        this.state = 324;
        this.match(ObjCParser.RPAREN);
        this.state = 326;
        _la = this._input.LA(1);
        if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << ObjCParser.DYNAMIC) | (1 << ObjCParser.SYNTHESIZE) | (1 << ObjCParser.AUTO) | (1 << ObjCParser.BYCOPY) | (1 << ObjCParser.BYREF) | (1 << ObjCParser.CHAR))) !== 0) || ((((_la - 32)) & ~0x1f) == 0 && ((1 << (_la - 32)) & ((1 << (ObjCParser.CONST - 32)) | (1 << (ObjCParser.DOUBLE - 32)) | (1 << (ObjCParser.ENUM - 32)) | (1 << (ObjCParser.EXTERN - 32)) | (1 << (ObjCParser.FLOAT - 32)) | (1 << (ObjCParser.ID - 32)) | (1 << (ObjCParser.IN - 32)) | (1 << (ObjCParser.INOUT - 32)) | (1 << (ObjCParser.INT - 32)) | (1 << (ObjCParser.LONG - 32)) | (1 << (ObjCParser.ONEWAY - 32)) | (1 << (ObjCParser.OUT - 32)) | (1 << (ObjCParser.REGISTER - 32)) | (1 << (ObjCParser.SHORT - 32)) | (1 << (ObjCParser.SIGNED - 32)) | (1 << (ObjCParser.STATIC - 32)) | (1 << (ObjCParser.STRUCT - 32)) | (1 << (ObjCParser.TYPEDEF - 32)) | (1 << (ObjCParser.UNION - 32)) | (1 << (ObjCParser.UNSIGNED - 32)) | (1 << (ObjCParser.VOID - 32)) | (1 << (ObjCParser.VOLATILE - 32)))) !== 0) || ((((_la - 65)) & ~0x1f) == 0 && ((1 << (_la - 65)) & ((1 << (ObjCParser.NS_OPTIONS - 65)) | (1 << (ObjCParser.NS_ENUM - 65)) | (1 << (ObjCParser.WWEAK - 65)) | (1 << (ObjCParser.WUNSAFE_UNRETAINED - 65)) | (1 << (ObjCParser.LPAREN - 65)) | (1 << (ObjCParser.ADD - 65)) | (1 << (ObjCParser.SUB - 65)))) !== 0) || _la===ObjCParser.MUL || _la===ObjCParser.IDENTIFIER) {
            this.state = 325;
            this.implementation_definition_list();
        }

        this.state = 328;
        this.match(ObjCParser.END);
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Protocol_declarationContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_protocol_declaration;
    return this;
}

Protocol_declarationContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Protocol_declarationContext.prototype.constructor = Protocol_declarationContext;

Protocol_declarationContext.prototype.protocol_name = function() {
    return this.getTypedRuleContext(Protocol_nameContext,0);
};

Protocol_declarationContext.prototype.protocol_reference_list = function() {
    return this.getTypedRuleContext(Protocol_reference_listContext,0);
};

Protocol_declarationContext.prototype.interface_declaration_list = function(i) {
    if(i===undefined) {
        i = null;
    }
    if(i===null) {
        return this.getTypedRuleContexts(Interface_declaration_listContext);
    } else {
        return this.getTypedRuleContext(Interface_declaration_listContext,i);
    }
};

Protocol_declarationContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterProtocol_declaration(this);
	}
};

Protocol_declarationContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitProtocol_declaration(this);
	}
};




ObjCParser.Protocol_declarationContext = Protocol_declarationContext;

ObjCParser.prototype.protocol_declaration = function() {

    var localctx = new Protocol_declarationContext(this, this._ctx, this.state);
    this.enterRule(localctx, 14, ObjCParser.RULE_protocol_declaration);
    var _la = 0; // Token type
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 330;
        this.match(ObjCParser.PROTOCOL);

        this.state = 331;
        this.protocol_name();
        this.state = 333;
        _la = this._input.LA(1);
        if(_la===ObjCParser.LT) {
            this.state = 332;
            this.protocol_reference_list();
        }

        this.state = 336;
        var la_ = this._interp.adaptivePredict(this._input,15,this._ctx);
        if(la_===1) {
            this.state = 335;
            this.interface_declaration_list();

        }
        this.state = 339;
        _la = this._input.LA(1);
        if(_la===ObjCParser.OPTIONAL) {
            this.state = 338;
            this.match(ObjCParser.OPTIONAL);
        }

        this.state = 342;
        _la = this._input.LA(1);
        if(((((_la - 14)) & ~0x1f) == 0 && ((1 << (_la - 14)) & ((1 << (ObjCParser.PROPERTY - 14)) | (1 << (ObjCParser.AUTO - 14)) | (1 << (ObjCParser.BYCOPY - 14)) | (1 << (ObjCParser.BYREF - 14)) | (1 << (ObjCParser.CHAR - 14)) | (1 << (ObjCParser.CONST - 14)) | (1 << (ObjCParser.DOUBLE - 14)) | (1 << (ObjCParser.ENUM - 14)) | (1 << (ObjCParser.EXTERN - 14)) | (1 << (ObjCParser.FLOAT - 14)) | (1 << (ObjCParser.ID - 14)) | (1 << (ObjCParser.IN - 14)) | (1 << (ObjCParser.INOUT - 14)))) !== 0) || ((((_la - 47)) & ~0x1f) == 0 && ((1 << (_la - 47)) & ((1 << (ObjCParser.INT - 47)) | (1 << (ObjCParser.LONG - 47)) | (1 << (ObjCParser.ONEWAY - 47)) | (1 << (ObjCParser.OUT - 47)) | (1 << (ObjCParser.REGISTER - 47)) | (1 << (ObjCParser.SHORT - 47)) | (1 << (ObjCParser.SIGNED - 47)) | (1 << (ObjCParser.STATIC - 47)) | (1 << (ObjCParser.STRUCT - 47)) | (1 << (ObjCParser.TYPEDEF - 47)) | (1 << (ObjCParser.UNION - 47)) | (1 << (ObjCParser.UNSIGNED - 47)) | (1 << (ObjCParser.VOID - 47)) | (1 << (ObjCParser.VOLATILE - 47)) | (1 << (ObjCParser.NS_OPTIONS - 47)) | (1 << (ObjCParser.NS_ENUM - 47)) | (1 << (ObjCParser.WWEAK - 47)) | (1 << (ObjCParser.WUNSAFE_UNRETAINED - 47)))) !== 0) || ((((_la - 95)) & ~0x1f) == 0 && ((1 << (_la - 95)) & ((1 << (ObjCParser.ADD - 95)) | (1 << (ObjCParser.SUB - 95)) | (1 << (ObjCParser.IDENTIFIER - 95)))) !== 0)) {
            this.state = 341;
            this.interface_declaration_list();
        }

        this.state = 344;
        this.match(ObjCParser.END);
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Protocol_declaration_listContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_protocol_declaration_list;
    return this;
}

Protocol_declaration_listContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Protocol_declaration_listContext.prototype.constructor = Protocol_declaration_listContext;

Protocol_declaration_listContext.prototype.protocol_list = function() {
    return this.getTypedRuleContext(Protocol_listContext,0);
};

Protocol_declaration_listContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterProtocol_declaration_list(this);
	}
};

Protocol_declaration_listContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitProtocol_declaration_list(this);
	}
};




ObjCParser.Protocol_declaration_listContext = Protocol_declaration_listContext;

ObjCParser.prototype.protocol_declaration_list = function() {

    var localctx = new Protocol_declaration_listContext(this, this._ctx, this.state);
    this.enterRule(localctx, 16, ObjCParser.RULE_protocol_declaration_list);
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 346;
        this.match(ObjCParser.PROTOCOL);
        this.state = 347;
        this.protocol_list();
        this.state = 348;
        this.match(ObjCParser.SEMI);
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Class_declaration_listContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_class_declaration_list;
    return this;
}

Class_declaration_listContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Class_declaration_listContext.prototype.constructor = Class_declaration_listContext;

Class_declaration_listContext.prototype.class_list = function() {
    return this.getTypedRuleContext(Class_listContext,0);
};

Class_declaration_listContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterClass_declaration_list(this);
	}
};

Class_declaration_listContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitClass_declaration_list(this);
	}
};




ObjCParser.Class_declaration_listContext = Class_declaration_listContext;

ObjCParser.prototype.class_declaration_list = function() {

    var localctx = new Class_declaration_listContext(this, this._ctx, this.state);
    this.enterRule(localctx, 18, ObjCParser.RULE_class_declaration_list);
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 350;
        this.match(ObjCParser.CLASS);
        this.state = 351;
        this.class_list();
        this.state = 352;
        this.match(ObjCParser.SEMI);
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Class_listContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_class_list;
    return this;
}

Class_listContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Class_listContext.prototype.constructor = Class_listContext;

Class_listContext.prototype.class_name = function(i) {
    if(i===undefined) {
        i = null;
    }
    if(i===null) {
        return this.getTypedRuleContexts(Class_nameContext);
    } else {
        return this.getTypedRuleContext(Class_nameContext,i);
    }
};

Class_listContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterClass_list(this);
	}
};

Class_listContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitClass_list(this);
	}
};




ObjCParser.Class_listContext = Class_listContext;

ObjCParser.prototype.class_list = function() {

    var localctx = new Class_listContext(this, this._ctx, this.state);
    this.enterRule(localctx, 20, ObjCParser.RULE_class_list);
    var _la = 0; // Token type
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 354;
        this.class_name();
        this.state = 359;
        this._errHandler.sync(this);
        _la = this._input.LA(1);
        while(_la===ObjCParser.COMMA) {
            this.state = 355;
            this.match(ObjCParser.COMMA);
            this.state = 356;
            this.class_name();
            this.state = 361;
            this._errHandler.sync(this);
            _la = this._input.LA(1);
        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Protocol_reference_listContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_protocol_reference_list;
    return this;
}

Protocol_reference_listContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Protocol_reference_listContext.prototype.constructor = Protocol_reference_listContext;

Protocol_reference_listContext.prototype.protocol_list = function() {
    return this.getTypedRuleContext(Protocol_listContext,0);
};

Protocol_reference_listContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterProtocol_reference_list(this);
	}
};

Protocol_reference_listContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitProtocol_reference_list(this);
	}
};




ObjCParser.Protocol_reference_listContext = Protocol_reference_listContext;

ObjCParser.prototype.protocol_reference_list = function() {

    var localctx = new Protocol_reference_listContext(this, this._ctx, this.state);
    this.enterRule(localctx, 22, ObjCParser.RULE_protocol_reference_list);
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 362;
        this.match(ObjCParser.LT);
        this.state = 363;
        this.protocol_list();
        this.state = 364;
        this.match(ObjCParser.GT);
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Protocol_listContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_protocol_list;
    return this;
}

Protocol_listContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Protocol_listContext.prototype.constructor = Protocol_listContext;

Protocol_listContext.prototype.protocol_name = function(i) {
    if(i===undefined) {
        i = null;
    }
    if(i===null) {
        return this.getTypedRuleContexts(Protocol_nameContext);
    } else {
        return this.getTypedRuleContext(Protocol_nameContext,i);
    }
};

Protocol_listContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterProtocol_list(this);
	}
};

Protocol_listContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitProtocol_list(this);
	}
};




ObjCParser.Protocol_listContext = Protocol_listContext;

ObjCParser.prototype.protocol_list = function() {

    var localctx = new Protocol_listContext(this, this._ctx, this.state);
    this.enterRule(localctx, 24, ObjCParser.RULE_protocol_list);
    var _la = 0; // Token type
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 366;
        this.protocol_name();
        this.state = 371;
        this._errHandler.sync(this);
        _la = this._input.LA(1);
        while(_la===ObjCParser.COMMA) {
            this.state = 367;
            this.match(ObjCParser.COMMA);
            this.state = 368;
            this.protocol_name();
            this.state = 373;
            this._errHandler.sync(this);
            _la = this._input.LA(1);
        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Property_declarationContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_property_declaration;
    return this;
}

Property_declarationContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Property_declarationContext.prototype.constructor = Property_declarationContext;

Property_declarationContext.prototype.struct_declaration = function() {
    return this.getTypedRuleContext(Struct_declarationContext,0);
};

Property_declarationContext.prototype.property_attributes_declaration = function() {
    return this.getTypedRuleContext(Property_attributes_declarationContext,0);
};

Property_declarationContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterProperty_declaration(this);
	}
};

Property_declarationContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitProperty_declaration(this);
	}
};




ObjCParser.Property_declarationContext = Property_declarationContext;

ObjCParser.prototype.property_declaration = function() {

    var localctx = new Property_declarationContext(this, this._ctx, this.state);
    this.enterRule(localctx, 26, ObjCParser.RULE_property_declaration);
    var _la = 0; // Token type
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 374;
        this.match(ObjCParser.PROPERTY);
        this.state = 376;
        _la = this._input.LA(1);
        if(_la===ObjCParser.LPAREN) {
            this.state = 375;
            this.property_attributes_declaration();
        }

        this.state = 378;
        this.struct_declaration();
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Property_attributes_declarationContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_property_attributes_declaration;
    return this;
}

Property_attributes_declarationContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Property_attributes_declarationContext.prototype.constructor = Property_attributes_declarationContext;

Property_attributes_declarationContext.prototype.property_attributes_list = function() {
    return this.getTypedRuleContext(Property_attributes_listContext,0);
};

Property_attributes_declarationContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterProperty_attributes_declaration(this);
	}
};

Property_attributes_declarationContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitProperty_attributes_declaration(this);
	}
};




ObjCParser.Property_attributes_declarationContext = Property_attributes_declarationContext;

ObjCParser.prototype.property_attributes_declaration = function() {

    var localctx = new Property_attributes_declarationContext(this, this._ctx, this.state);
    this.enterRule(localctx, 28, ObjCParser.RULE_property_attributes_declaration);
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 380;
        this.match(ObjCParser.LPAREN);
        this.state = 381;
        this.property_attributes_list();
        this.state = 382;
        this.match(ObjCParser.RPAREN);
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Property_attributes_listContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_property_attributes_list;
    return this;
}

Property_attributes_listContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Property_attributes_listContext.prototype.constructor = Property_attributes_listContext;

Property_attributes_listContext.prototype.property_attribute = function(i) {
    if(i===undefined) {
        i = null;
    }
    if(i===null) {
        return this.getTypedRuleContexts(Property_attributeContext);
    } else {
        return this.getTypedRuleContext(Property_attributeContext,i);
    }
};

Property_attributes_listContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterProperty_attributes_list(this);
	}
};

Property_attributes_listContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitProperty_attributes_list(this);
	}
};




ObjCParser.Property_attributes_listContext = Property_attributes_listContext;

ObjCParser.prototype.property_attributes_list = function() {

    var localctx = new Property_attributes_listContext(this, this._ctx, this.state);
    this.enterRule(localctx, 30, ObjCParser.RULE_property_attributes_list);
    var _la = 0; // Token type
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 384;
        this.property_attribute();
        this.state = 389;
        this._errHandler.sync(this);
        _la = this._input.LA(1);
        while(_la===ObjCParser.COMMA) {
            this.state = 385;
            this.match(ObjCParser.COMMA);
            this.state = 386;
            this.property_attribute();
            this.state = 391;
            this._errHandler.sync(this);
            _la = this._input.LA(1);
        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Property_attributeContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_property_attribute;
    return this;
}

Property_attributeContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Property_attributeContext.prototype.constructor = Property_attributeContext;

Property_attributeContext.prototype.IDENTIFIER = function() {
    return this.getToken(ObjCParser.IDENTIFIER, 0);
};

Property_attributeContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterProperty_attribute(this);
	}
};

Property_attributeContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitProperty_attribute(this);
	}
};




ObjCParser.Property_attributeContext = Property_attributeContext;

ObjCParser.prototype.property_attribute = function() {

    var localctx = new Property_attributeContext(this, this._ctx, this.state);
    this.enterRule(localctx, 32, ObjCParser.RULE_property_attribute);
    try {
        this.state = 408;
        switch(this._input.LA(1)) {
        case ObjCParser.NONATOMIC:
            this.enterOuterAlt(localctx, 1);
            this.state = 392;
            this.match(ObjCParser.NONATOMIC);
            break;
        case ObjCParser.ASSIGNPA:
            this.enterOuterAlt(localctx, 2);
            this.state = 393;
            this.match(ObjCParser.ASSIGNPA);
            break;
        case ObjCParser.WEAK:
            this.enterOuterAlt(localctx, 3);
            this.state = 394;
            this.match(ObjCParser.WEAK);
            break;
        case ObjCParser.STRONG:
            this.enterOuterAlt(localctx, 4);
            this.state = 395;
            this.match(ObjCParser.STRONG);
            break;
        case ObjCParser.RETAIN:
            this.enterOuterAlt(localctx, 5);
            this.state = 396;
            this.match(ObjCParser.RETAIN);
            break;
        case ObjCParser.READONLY:
            this.enterOuterAlt(localctx, 6);
            this.state = 397;
            this.match(ObjCParser.READONLY);
            break;
        case ObjCParser.READWRITE:
            this.enterOuterAlt(localctx, 7);
            this.state = 398;
            this.match(ObjCParser.READWRITE);
            break;
        case ObjCParser.RPAREN:
        case ObjCParser.COMMA:
            this.enterOuterAlt(localctx, 8);

            break;
        case ObjCParser.GETTER:
            this.enterOuterAlt(localctx, 9);
            this.state = 400;
            this.match(ObjCParser.GETTER);
            this.state = 401;
            this.match(ObjCParser.ASSIGN);
            this.state = 402;
            this.match(ObjCParser.IDENTIFIER);
            break;
        case ObjCParser.SETTER:
            this.enterOuterAlt(localctx, 10);
            this.state = 403;
            this.match(ObjCParser.SETTER);
            this.state = 404;
            this.match(ObjCParser.ASSIGN);
            this.state = 405;
            this.match(ObjCParser.IDENTIFIER);
            this.state = 406;
            this.match(ObjCParser.COLON);
            break;
        case ObjCParser.IDENTIFIER:
            this.enterOuterAlt(localctx, 11);
            this.state = 407;
            this.match(ObjCParser.IDENTIFIER);
            break;
        default:
            throw new antlr4.error.NoViableAltException(this);
        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Class_nameContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_class_name;
    return this;
}

Class_nameContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Class_nameContext.prototype.constructor = Class_nameContext;

Class_nameContext.prototype.IDENTIFIER = function() {
    return this.getToken(ObjCParser.IDENTIFIER, 0);
};

Class_nameContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterClass_name(this);
	}
};

Class_nameContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitClass_name(this);
	}
};




ObjCParser.Class_nameContext = Class_nameContext;

ObjCParser.prototype.class_name = function() {

    var localctx = new Class_nameContext(this, this._ctx, this.state);
    this.enterRule(localctx, 34, ObjCParser.RULE_class_name);
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 410;
        this.match(ObjCParser.IDENTIFIER);
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Superclass_nameContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_superclass_name;
    return this;
}

Superclass_nameContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Superclass_nameContext.prototype.constructor = Superclass_nameContext;

Superclass_nameContext.prototype.IDENTIFIER = function() {
    return this.getToken(ObjCParser.IDENTIFIER, 0);
};

Superclass_nameContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterSuperclass_name(this);
	}
};

Superclass_nameContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitSuperclass_name(this);
	}
};




ObjCParser.Superclass_nameContext = Superclass_nameContext;

ObjCParser.prototype.superclass_name = function() {

    var localctx = new Superclass_nameContext(this, this._ctx, this.state);
    this.enterRule(localctx, 36, ObjCParser.RULE_superclass_name);
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 412;
        this.match(ObjCParser.IDENTIFIER);
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Category_nameContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_category_name;
    return this;
}

Category_nameContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Category_nameContext.prototype.constructor = Category_nameContext;

Category_nameContext.prototype.IDENTIFIER = function() {
    return this.getToken(ObjCParser.IDENTIFIER, 0);
};

Category_nameContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterCategory_name(this);
	}
};

Category_nameContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitCategory_name(this);
	}
};




ObjCParser.Category_nameContext = Category_nameContext;

ObjCParser.prototype.category_name = function() {

    var localctx = new Category_nameContext(this, this._ctx, this.state);
    this.enterRule(localctx, 38, ObjCParser.RULE_category_name);
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 414;
        this.match(ObjCParser.IDENTIFIER);
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Protocol_nameContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_protocol_name;
    return this;
}

Protocol_nameContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Protocol_nameContext.prototype.constructor = Protocol_nameContext;

Protocol_nameContext.prototype.IDENTIFIER = function() {
    return this.getToken(ObjCParser.IDENTIFIER, 0);
};

Protocol_nameContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterProtocol_name(this);
	}
};

Protocol_nameContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitProtocol_name(this);
	}
};




ObjCParser.Protocol_nameContext = Protocol_nameContext;

ObjCParser.prototype.protocol_name = function() {

    var localctx = new Protocol_nameContext(this, this._ctx, this.state);
    this.enterRule(localctx, 40, ObjCParser.RULE_protocol_name);
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 416;
        this.match(ObjCParser.IDENTIFIER);
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Instance_variablesContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_instance_variables;
    return this;
}

Instance_variablesContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Instance_variablesContext.prototype.constructor = Instance_variablesContext;

Instance_variablesContext.prototype.struct_declaration = function(i) {
    if(i===undefined) {
        i = null;
    }
    if(i===null) {
        return this.getTypedRuleContexts(Struct_declarationContext);
    } else {
        return this.getTypedRuleContext(Struct_declarationContext,i);
    }
};

Instance_variablesContext.prototype.visibility_specification = function() {
    return this.getTypedRuleContext(Visibility_specificationContext,0);
};

Instance_variablesContext.prototype.instance_variables = function() {
    return this.getTypedRuleContext(Instance_variablesContext,0);
};

Instance_variablesContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterInstance_variables(this);
	}
};

Instance_variablesContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitInstance_variables(this);
	}
};




ObjCParser.Instance_variablesContext = Instance_variablesContext;

ObjCParser.prototype.instance_variables = function() {

    var localctx = new Instance_variablesContext(this, this._ctx, this.state);
    this.enterRule(localctx, 42, ObjCParser.RULE_instance_variables);
    var _la = 0; // Token type
    try {
        this.state = 454;
        var la_ = this._interp.adaptivePredict(this._input,27,this._ctx);
        switch(la_) {
        case 1:
            this.enterOuterAlt(localctx, 1);
            this.state = 418;
            this.match(ObjCParser.LBRACE);
            this.state = 422;
            this._errHandler.sync(this);
            _la = this._input.LA(1);
            while(((((_la - 28)) & ~0x1f) == 0 && ((1 << (_la - 28)) & ((1 << (ObjCParser.BYCOPY - 28)) | (1 << (ObjCParser.BYREF - 28)) | (1 << (ObjCParser.CHAR - 28)) | (1 << (ObjCParser.CONST - 28)) | (1 << (ObjCParser.DOUBLE - 28)) | (1 << (ObjCParser.ENUM - 28)) | (1 << (ObjCParser.FLOAT - 28)) | (1 << (ObjCParser.ID - 28)) | (1 << (ObjCParser.IN - 28)) | (1 << (ObjCParser.INOUT - 28)) | (1 << (ObjCParser.INT - 28)) | (1 << (ObjCParser.LONG - 28)) | (1 << (ObjCParser.ONEWAY - 28)) | (1 << (ObjCParser.OUT - 28)) | (1 << (ObjCParser.SHORT - 28)) | (1 << (ObjCParser.SIGNED - 28)) | (1 << (ObjCParser.STRUCT - 28)))) !== 0) || ((((_la - 60)) & ~0x1f) == 0 && ((1 << (_la - 60)) & ((1 << (ObjCParser.UNION - 60)) | (1 << (ObjCParser.UNSIGNED - 60)) | (1 << (ObjCParser.VOID - 60)) | (1 << (ObjCParser.VOLATILE - 60)) | (1 << (ObjCParser.NS_OPTIONS - 60)) | (1 << (ObjCParser.NS_ENUM - 60)) | (1 << (ObjCParser.WWEAK - 60)) | (1 << (ObjCParser.WUNSAFE_UNRETAINED - 60)))) !== 0) || _la===ObjCParser.IDENTIFIER) {
                this.state = 419;
                this.struct_declaration();
                this.state = 424;
                this._errHandler.sync(this);
                _la = this._input.LA(1);
            }
            this.state = 425;
            this.match(ObjCParser.RBRACE);
            break;

        case 2:
            this.enterOuterAlt(localctx, 2);
            this.state = 426;
            this.match(ObjCParser.LBRACE);
            this.state = 427;
            this.visibility_specification();
            this.state = 429; 
            this._errHandler.sync(this);
            _la = this._input.LA(1);
            do {
                this.state = 428;
                this.struct_declaration();
                this.state = 431; 
                this._errHandler.sync(this);
                _la = this._input.LA(1);
            } while(((((_la - 28)) & ~0x1f) == 0 && ((1 << (_la - 28)) & ((1 << (ObjCParser.BYCOPY - 28)) | (1 << (ObjCParser.BYREF - 28)) | (1 << (ObjCParser.CHAR - 28)) | (1 << (ObjCParser.CONST - 28)) | (1 << (ObjCParser.DOUBLE - 28)) | (1 << (ObjCParser.ENUM - 28)) | (1 << (ObjCParser.FLOAT - 28)) | (1 << (ObjCParser.ID - 28)) | (1 << (ObjCParser.IN - 28)) | (1 << (ObjCParser.INOUT - 28)) | (1 << (ObjCParser.INT - 28)) | (1 << (ObjCParser.LONG - 28)) | (1 << (ObjCParser.ONEWAY - 28)) | (1 << (ObjCParser.OUT - 28)) | (1 << (ObjCParser.SHORT - 28)) | (1 << (ObjCParser.SIGNED - 28)) | (1 << (ObjCParser.STRUCT - 28)))) !== 0) || ((((_la - 60)) & ~0x1f) == 0 && ((1 << (_la - 60)) & ((1 << (ObjCParser.UNION - 60)) | (1 << (ObjCParser.UNSIGNED - 60)) | (1 << (ObjCParser.VOID - 60)) | (1 << (ObjCParser.VOLATILE - 60)) | (1 << (ObjCParser.NS_OPTIONS - 60)) | (1 << (ObjCParser.NS_ENUM - 60)) | (1 << (ObjCParser.WWEAK - 60)) | (1 << (ObjCParser.WUNSAFE_UNRETAINED - 60)))) !== 0) || _la===ObjCParser.IDENTIFIER);
            this.state = 433;
            this.match(ObjCParser.RBRACE);
            break;

        case 3:
            this.enterOuterAlt(localctx, 3);
            this.state = 435;
            this.match(ObjCParser.LBRACE);
            this.state = 437; 
            this._errHandler.sync(this);
            _la = this._input.LA(1);
            do {
                this.state = 436;
                this.struct_declaration();
                this.state = 439; 
                this._errHandler.sync(this);
                _la = this._input.LA(1);
            } while(((((_la - 28)) & ~0x1f) == 0 && ((1 << (_la - 28)) & ((1 << (ObjCParser.BYCOPY - 28)) | (1 << (ObjCParser.BYREF - 28)) | (1 << (ObjCParser.CHAR - 28)) | (1 << (ObjCParser.CONST - 28)) | (1 << (ObjCParser.DOUBLE - 28)) | (1 << (ObjCParser.ENUM - 28)) | (1 << (ObjCParser.FLOAT - 28)) | (1 << (ObjCParser.ID - 28)) | (1 << (ObjCParser.IN - 28)) | (1 << (ObjCParser.INOUT - 28)) | (1 << (ObjCParser.INT - 28)) | (1 << (ObjCParser.LONG - 28)) | (1 << (ObjCParser.ONEWAY - 28)) | (1 << (ObjCParser.OUT - 28)) | (1 << (ObjCParser.SHORT - 28)) | (1 << (ObjCParser.SIGNED - 28)) | (1 << (ObjCParser.STRUCT - 28)))) !== 0) || ((((_la - 60)) & ~0x1f) == 0 && ((1 << (_la - 60)) & ((1 << (ObjCParser.UNION - 60)) | (1 << (ObjCParser.UNSIGNED - 60)) | (1 << (ObjCParser.VOID - 60)) | (1 << (ObjCParser.VOLATILE - 60)) | (1 << (ObjCParser.NS_OPTIONS - 60)) | (1 << (ObjCParser.NS_ENUM - 60)) | (1 << (ObjCParser.WWEAK - 60)) | (1 << (ObjCParser.WUNSAFE_UNRETAINED - 60)))) !== 0) || _la===ObjCParser.IDENTIFIER);
            this.state = 441;
            this.instance_variables();
            this.state = 442;
            this.match(ObjCParser.RBRACE);
            break;

        case 4:
            this.enterOuterAlt(localctx, 4);
            this.state = 444;
            this.match(ObjCParser.LBRACE);
            this.state = 445;
            this.visibility_specification();
            this.state = 447; 
            this._errHandler.sync(this);
            _la = this._input.LA(1);
            do {
                this.state = 446;
                this.struct_declaration();
                this.state = 449; 
                this._errHandler.sync(this);
                _la = this._input.LA(1);
            } while(((((_la - 28)) & ~0x1f) == 0 && ((1 << (_la - 28)) & ((1 << (ObjCParser.BYCOPY - 28)) | (1 << (ObjCParser.BYREF - 28)) | (1 << (ObjCParser.CHAR - 28)) | (1 << (ObjCParser.CONST - 28)) | (1 << (ObjCParser.DOUBLE - 28)) | (1 << (ObjCParser.ENUM - 28)) | (1 << (ObjCParser.FLOAT - 28)) | (1 << (ObjCParser.ID - 28)) | (1 << (ObjCParser.IN - 28)) | (1 << (ObjCParser.INOUT - 28)) | (1 << (ObjCParser.INT - 28)) | (1 << (ObjCParser.LONG - 28)) | (1 << (ObjCParser.ONEWAY - 28)) | (1 << (ObjCParser.OUT - 28)) | (1 << (ObjCParser.SHORT - 28)) | (1 << (ObjCParser.SIGNED - 28)) | (1 << (ObjCParser.STRUCT - 28)))) !== 0) || ((((_la - 60)) & ~0x1f) == 0 && ((1 << (_la - 60)) & ((1 << (ObjCParser.UNION - 60)) | (1 << (ObjCParser.UNSIGNED - 60)) | (1 << (ObjCParser.VOID - 60)) | (1 << (ObjCParser.VOLATILE - 60)) | (1 << (ObjCParser.NS_OPTIONS - 60)) | (1 << (ObjCParser.NS_ENUM - 60)) | (1 << (ObjCParser.WWEAK - 60)) | (1 << (ObjCParser.WUNSAFE_UNRETAINED - 60)))) !== 0) || _la===ObjCParser.IDENTIFIER);
            this.state = 451;
            this.instance_variables();
            this.state = 452;
            this.match(ObjCParser.RBRACE);
            break;

        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Visibility_specificationContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_visibility_specification;
    return this;
}

Visibility_specificationContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Visibility_specificationContext.prototype.constructor = Visibility_specificationContext;


Visibility_specificationContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterVisibility_specification(this);
	}
};

Visibility_specificationContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitVisibility_specification(this);
	}
};




ObjCParser.Visibility_specificationContext = Visibility_specificationContext;

ObjCParser.prototype.visibility_specification = function() {

    var localctx = new Visibility_specificationContext(this, this._ctx, this.state);
    this.enterRule(localctx, 44, ObjCParser.RULE_visibility_specification);
    var _la = 0; // Token type
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 456;
        _la = this._input.LA(1);
        if(!((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << ObjCParser.PACKAGE) | (1 << ObjCParser.PRIVATE) | (1 << ObjCParser.PROTECTED) | (1 << ObjCParser.PUBLIC))) !== 0))) {
        this._errHandler.recoverInline(this);
        }
        else {
            this.consume();
        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Interface_declaration_listContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_interface_declaration_list;
    return this;
}

Interface_declaration_listContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Interface_declaration_listContext.prototype.constructor = Interface_declaration_listContext;

Interface_declaration_listContext.prototype.declaration = function(i) {
    if(i===undefined) {
        i = null;
    }
    if(i===null) {
        return this.getTypedRuleContexts(DeclarationContext);
    } else {
        return this.getTypedRuleContext(DeclarationContext,i);
    }
};

Interface_declaration_listContext.prototype.class_method_declaration = function(i) {
    if(i===undefined) {
        i = null;
    }
    if(i===null) {
        return this.getTypedRuleContexts(Class_method_declarationContext);
    } else {
        return this.getTypedRuleContext(Class_method_declarationContext,i);
    }
};

Interface_declaration_listContext.prototype.instance_method_declaration = function(i) {
    if(i===undefined) {
        i = null;
    }
    if(i===null) {
        return this.getTypedRuleContexts(Instance_method_declarationContext);
    } else {
        return this.getTypedRuleContext(Instance_method_declarationContext,i);
    }
};

Interface_declaration_listContext.prototype.property_declaration = function(i) {
    if(i===undefined) {
        i = null;
    }
    if(i===null) {
        return this.getTypedRuleContexts(Property_declarationContext);
    } else {
        return this.getTypedRuleContext(Property_declarationContext,i);
    }
};

Interface_declaration_listContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterInterface_declaration_list(this);
	}
};

Interface_declaration_listContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitInterface_declaration_list(this);
	}
};




ObjCParser.Interface_declaration_listContext = Interface_declaration_listContext;

ObjCParser.prototype.interface_declaration_list = function() {

    var localctx = new Interface_declaration_listContext(this, this._ctx, this.state);
    this.enterRule(localctx, 46, ObjCParser.RULE_interface_declaration_list);
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 462; 
        this._errHandler.sync(this);
        var _alt = 1;
        do {
        	switch (_alt) {
        	case 1:
        		this.state = 462;
        		switch(this._input.LA(1)) {
        		case ObjCParser.AUTO:
        		case ObjCParser.BYCOPY:
        		case ObjCParser.BYREF:
        		case ObjCParser.CHAR:
        		case ObjCParser.CONST:
        		case ObjCParser.DOUBLE:
        		case ObjCParser.ENUM:
        		case ObjCParser.EXTERN:
        		case ObjCParser.FLOAT:
        		case ObjCParser.ID:
        		case ObjCParser.IN:
        		case ObjCParser.INOUT:
        		case ObjCParser.INT:
        		case ObjCParser.LONG:
        		case ObjCParser.ONEWAY:
        		case ObjCParser.OUT:
        		case ObjCParser.REGISTER:
        		case ObjCParser.SHORT:
        		case ObjCParser.SIGNED:
        		case ObjCParser.STATIC:
        		case ObjCParser.STRUCT:
        		case ObjCParser.TYPEDEF:
        		case ObjCParser.UNION:
        		case ObjCParser.UNSIGNED:
        		case ObjCParser.VOID:
        		case ObjCParser.VOLATILE:
        		case ObjCParser.NS_OPTIONS:
        		case ObjCParser.NS_ENUM:
        		case ObjCParser.WWEAK:
        		case ObjCParser.WUNSAFE_UNRETAINED:
        		case ObjCParser.IDENTIFIER:
        		    this.state = 458;
        		    this.declaration();
        		    break;
        		case ObjCParser.ADD:
        		    this.state = 459;
        		    this.class_method_declaration();
        		    break;
        		case ObjCParser.SUB:
        		    this.state = 460;
        		    this.instance_method_declaration();
        		    break;
        		case ObjCParser.PROPERTY:
        		    this.state = 461;
        		    this.property_declaration();
        		    break;
        		default:
        		    throw new antlr4.error.NoViableAltException(this);
        		}
        		break;
        	default:
        		throw new antlr4.error.NoViableAltException(this);
        	}
        	this.state = 464; 
        	this._errHandler.sync(this);
        	_alt = this._interp.adaptivePredict(this._input,29, this._ctx);
        } while ( _alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER );
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Class_method_declarationContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_class_method_declaration;
    return this;
}

Class_method_declarationContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Class_method_declarationContext.prototype.constructor = Class_method_declarationContext;

Class_method_declarationContext.prototype.method_declaration = function() {
    return this.getTypedRuleContext(Method_declarationContext,0);
};

Class_method_declarationContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterClass_method_declaration(this);
	}
};

Class_method_declarationContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitClass_method_declaration(this);
	}
};




ObjCParser.Class_method_declarationContext = Class_method_declarationContext;

ObjCParser.prototype.class_method_declaration = function() {

    var localctx = new Class_method_declarationContext(this, this._ctx, this.state);
    this.enterRule(localctx, 48, ObjCParser.RULE_class_method_declaration);
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 466;
        this.match(ObjCParser.ADD);
        this.state = 467;
        this.method_declaration();
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Instance_method_declarationContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_instance_method_declaration;
    return this;
}

Instance_method_declarationContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Instance_method_declarationContext.prototype.constructor = Instance_method_declarationContext;

Instance_method_declarationContext.prototype.method_declaration = function() {
    return this.getTypedRuleContext(Method_declarationContext,0);
};

Instance_method_declarationContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterInstance_method_declaration(this);
	}
};

Instance_method_declarationContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitInstance_method_declaration(this);
	}
};




ObjCParser.Instance_method_declarationContext = Instance_method_declarationContext;

ObjCParser.prototype.instance_method_declaration = function() {

    var localctx = new Instance_method_declarationContext(this, this._ctx, this.state);
    this.enterRule(localctx, 50, ObjCParser.RULE_instance_method_declaration);
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 469;
        this.match(ObjCParser.SUB);
        this.state = 470;
        this.method_declaration();
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Method_declarationContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_method_declaration;
    return this;
}

Method_declarationContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Method_declarationContext.prototype.constructor = Method_declarationContext;

Method_declarationContext.prototype.method_selector = function() {
    return this.getTypedRuleContext(Method_selectorContext,0);
};

Method_declarationContext.prototype.method_type = function() {
    return this.getTypedRuleContext(Method_typeContext,0);
};

Method_declarationContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterMethod_declaration(this);
	}
};

Method_declarationContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitMethod_declaration(this);
	}
};




ObjCParser.Method_declarationContext = Method_declarationContext;

ObjCParser.prototype.method_declaration = function() {

    var localctx = new Method_declarationContext(this, this._ctx, this.state);
    this.enterRule(localctx, 52, ObjCParser.RULE_method_declaration);
    var _la = 0; // Token type
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 473;
        _la = this._input.LA(1);
        if(_la===ObjCParser.LPAREN) {
            this.state = 472;
            this.method_type();
        }

        this.state = 475;
        this.method_selector();
        this.state = 476;
        this.match(ObjCParser.SEMI);
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Implementation_definition_listContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_implementation_definition_list;
    return this;
}

Implementation_definition_listContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Implementation_definition_listContext.prototype.constructor = Implementation_definition_listContext;

Implementation_definition_listContext.prototype.function_definition = function(i) {
    if(i===undefined) {
        i = null;
    }
    if(i===null) {
        return this.getTypedRuleContexts(Function_definitionContext);
    } else {
        return this.getTypedRuleContext(Function_definitionContext,i);
    }
};

Implementation_definition_listContext.prototype.declaration = function(i) {
    if(i===undefined) {
        i = null;
    }
    if(i===null) {
        return this.getTypedRuleContexts(DeclarationContext);
    } else {
        return this.getTypedRuleContext(DeclarationContext,i);
    }
};

Implementation_definition_listContext.prototype.class_method_definition = function(i) {
    if(i===undefined) {
        i = null;
    }
    if(i===null) {
        return this.getTypedRuleContexts(Class_method_definitionContext);
    } else {
        return this.getTypedRuleContext(Class_method_definitionContext,i);
    }
};

Implementation_definition_listContext.prototype.instance_method_definition = function(i) {
    if(i===undefined) {
        i = null;
    }
    if(i===null) {
        return this.getTypedRuleContexts(Instance_method_definitionContext);
    } else {
        return this.getTypedRuleContext(Instance_method_definitionContext,i);
    }
};

Implementation_definition_listContext.prototype.property_implementation = function(i) {
    if(i===undefined) {
        i = null;
    }
    if(i===null) {
        return this.getTypedRuleContexts(Property_implementationContext);
    } else {
        return this.getTypedRuleContext(Property_implementationContext,i);
    }
};

Implementation_definition_listContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterImplementation_definition_list(this);
	}
};

Implementation_definition_listContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitImplementation_definition_list(this);
	}
};




ObjCParser.Implementation_definition_listContext = Implementation_definition_listContext;

ObjCParser.prototype.implementation_definition_list = function() {

    var localctx = new Implementation_definition_listContext(this, this._ctx, this.state);
    this.enterRule(localctx, 54, ObjCParser.RULE_implementation_definition_list);
    var _la = 0; // Token type
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 483; 
        this._errHandler.sync(this);
        _la = this._input.LA(1);
        do {
            this.state = 483;
            var la_ = this._interp.adaptivePredict(this._input,31,this._ctx);
            switch(la_) {
            case 1:
                this.state = 478;
                this.function_definition();
                break;

            case 2:
                this.state = 479;
                this.declaration();
                break;

            case 3:
                this.state = 480;
                this.class_method_definition();
                break;

            case 4:
                this.state = 481;
                this.instance_method_definition();
                break;

            case 5:
                this.state = 482;
                this.property_implementation();
                break;

            }
            this.state = 485; 
            this._errHandler.sync(this);
            _la = this._input.LA(1);
        } while((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << ObjCParser.DYNAMIC) | (1 << ObjCParser.SYNTHESIZE) | (1 << ObjCParser.AUTO) | (1 << ObjCParser.BYCOPY) | (1 << ObjCParser.BYREF) | (1 << ObjCParser.CHAR))) !== 0) || ((((_la - 32)) & ~0x1f) == 0 && ((1 << (_la - 32)) & ((1 << (ObjCParser.CONST - 32)) | (1 << (ObjCParser.DOUBLE - 32)) | (1 << (ObjCParser.ENUM - 32)) | (1 << (ObjCParser.EXTERN - 32)) | (1 << (ObjCParser.FLOAT - 32)) | (1 << (ObjCParser.ID - 32)) | (1 << (ObjCParser.IN - 32)) | (1 << (ObjCParser.INOUT - 32)) | (1 << (ObjCParser.INT - 32)) | (1 << (ObjCParser.LONG - 32)) | (1 << (ObjCParser.ONEWAY - 32)) | (1 << (ObjCParser.OUT - 32)) | (1 << (ObjCParser.REGISTER - 32)) | (1 << (ObjCParser.SHORT - 32)) | (1 << (ObjCParser.SIGNED - 32)) | (1 << (ObjCParser.STATIC - 32)) | (1 << (ObjCParser.STRUCT - 32)) | (1 << (ObjCParser.TYPEDEF - 32)) | (1 << (ObjCParser.UNION - 32)) | (1 << (ObjCParser.UNSIGNED - 32)) | (1 << (ObjCParser.VOID - 32)) | (1 << (ObjCParser.VOLATILE - 32)))) !== 0) || ((((_la - 65)) & ~0x1f) == 0 && ((1 << (_la - 65)) & ((1 << (ObjCParser.NS_OPTIONS - 65)) | (1 << (ObjCParser.NS_ENUM - 65)) | (1 << (ObjCParser.WWEAK - 65)) | (1 << (ObjCParser.WUNSAFE_UNRETAINED - 65)) | (1 << (ObjCParser.LPAREN - 65)) | (1 << (ObjCParser.ADD - 65)) | (1 << (ObjCParser.SUB - 65)))) !== 0) || _la===ObjCParser.MUL || _la===ObjCParser.IDENTIFIER);
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Class_method_definitionContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_class_method_definition;
    return this;
}

Class_method_definitionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Class_method_definitionContext.prototype.constructor = Class_method_definitionContext;

Class_method_definitionContext.prototype.method_definition = function() {
    return this.getTypedRuleContext(Method_definitionContext,0);
};

Class_method_definitionContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterClass_method_definition(this);
	}
};

Class_method_definitionContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitClass_method_definition(this);
	}
};




ObjCParser.Class_method_definitionContext = Class_method_definitionContext;

ObjCParser.prototype.class_method_definition = function() {

    var localctx = new Class_method_definitionContext(this, this._ctx, this.state);
    this.enterRule(localctx, 56, ObjCParser.RULE_class_method_definition);
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 487;
        this.match(ObjCParser.ADD);
        this.state = 488;
        this.method_definition();
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Instance_method_definitionContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_instance_method_definition;
    return this;
}

Instance_method_definitionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Instance_method_definitionContext.prototype.constructor = Instance_method_definitionContext;

Instance_method_definitionContext.prototype.method_definition = function() {
    return this.getTypedRuleContext(Method_definitionContext,0);
};

Instance_method_definitionContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterInstance_method_definition(this);
	}
};

Instance_method_definitionContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitInstance_method_definition(this);
	}
};




ObjCParser.Instance_method_definitionContext = Instance_method_definitionContext;

ObjCParser.prototype.instance_method_definition = function() {

    var localctx = new Instance_method_definitionContext(this, this._ctx, this.state);
    this.enterRule(localctx, 58, ObjCParser.RULE_instance_method_definition);
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 490;
        this.match(ObjCParser.SUB);
        this.state = 491;
        this.method_definition();
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Method_definitionContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_method_definition;
    return this;
}

Method_definitionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Method_definitionContext.prototype.constructor = Method_definitionContext;

Method_definitionContext.prototype.method_selector = function() {
    return this.getTypedRuleContext(Method_selectorContext,0);
};

Method_definitionContext.prototype.compound_statement = function() {
    return this.getTypedRuleContext(Compound_statementContext,0);
};

Method_definitionContext.prototype.method_type = function() {
    return this.getTypedRuleContext(Method_typeContext,0);
};

Method_definitionContext.prototype.init_declarator_list = function() {
    return this.getTypedRuleContext(Init_declarator_listContext,0);
};

Method_definitionContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterMethod_definition(this);
	}
};

Method_definitionContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitMethod_definition(this);
	}
};




ObjCParser.Method_definitionContext = Method_definitionContext;

ObjCParser.prototype.method_definition = function() {

    var localctx = new Method_definitionContext(this, this._ctx, this.state);
    this.enterRule(localctx, 60, ObjCParser.RULE_method_definition);
    var _la = 0; // Token type
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 494;
        _la = this._input.LA(1);
        if(_la===ObjCParser.LPAREN) {
            this.state = 493;
            this.method_type();
        }

        this.state = 496;
        this.method_selector();
        this.state = 498;
        _la = this._input.LA(1);
        if(_la===ObjCParser.LPAREN || _la===ObjCParser.MUL || _la===ObjCParser.IDENTIFIER) {
            this.state = 497;
            this.init_declarator_list();
        }

        this.state = 501;
        _la = this._input.LA(1);
        if(_la===ObjCParser.SEMI) {
            this.state = 500;
            this.match(ObjCParser.SEMI);
        }

        this.state = 503;
        this.compound_statement();
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Method_selectorContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_method_selector;
    return this;
}

Method_selectorContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Method_selectorContext.prototype.constructor = Method_selectorContext;

Method_selectorContext.prototype.selector = function() {
    return this.getTypedRuleContext(SelectorContext,0);
};

Method_selectorContext.prototype.keyword_declarator = function(i) {
    if(i===undefined) {
        i = null;
    }
    if(i===null) {
        return this.getTypedRuleContexts(Keyword_declaratorContext);
    } else {
        return this.getTypedRuleContext(Keyword_declaratorContext,i);
    }
};

Method_selectorContext.prototype.parameter_list = function() {
    return this.getTypedRuleContext(Parameter_listContext,0);
};

Method_selectorContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterMethod_selector(this);
	}
};

Method_selectorContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitMethod_selector(this);
	}
};




ObjCParser.Method_selectorContext = Method_selectorContext;

ObjCParser.prototype.method_selector = function() {

    var localctx = new Method_selectorContext(this, this._ctx, this.state);
    this.enterRule(localctx, 62, ObjCParser.RULE_method_selector);
    try {
        this.state = 514;
        var la_ = this._interp.adaptivePredict(this._input,38,this._ctx);
        switch(la_) {
        case 1:
            this.enterOuterAlt(localctx, 1);
            this.state = 505;
            this.selector();
            break;

        case 2:
            this.enterOuterAlt(localctx, 2);
            this.state = 507; 
            this._errHandler.sync(this);
            var _alt = 1;
            do {
            	switch (_alt) {
            	case 1:
            		this.state = 506;
            		this.keyword_declarator();
            		break;
            	default:
            		throw new antlr4.error.NoViableAltException(this);
            	}
            	this.state = 509; 
            	this._errHandler.sync(this);
            	_alt = this._interp.adaptivePredict(this._input,36, this._ctx);
            } while ( _alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER );
            this.state = 512;
            var la_ = this._interp.adaptivePredict(this._input,37,this._ctx);
            if(la_===1) {
                this.state = 511;
                this.parameter_list();

            }
            break;

        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Keyword_declaratorContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_keyword_declarator;
    return this;
}

Keyword_declaratorContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Keyword_declaratorContext.prototype.constructor = Keyword_declaratorContext;

Keyword_declaratorContext.prototype.IDENTIFIER = function() {
    return this.getToken(ObjCParser.IDENTIFIER, 0);
};

Keyword_declaratorContext.prototype.selector = function() {
    return this.getTypedRuleContext(SelectorContext,0);
};

Keyword_declaratorContext.prototype.method_type = function(i) {
    if(i===undefined) {
        i = null;
    }
    if(i===null) {
        return this.getTypedRuleContexts(Method_typeContext);
    } else {
        return this.getTypedRuleContext(Method_typeContext,i);
    }
};

Keyword_declaratorContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterKeyword_declarator(this);
	}
};

Keyword_declaratorContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitKeyword_declarator(this);
	}
};




ObjCParser.Keyword_declaratorContext = Keyword_declaratorContext;

ObjCParser.prototype.keyword_declarator = function() {

    var localctx = new Keyword_declaratorContext(this, this._ctx, this.state);
    this.enterRule(localctx, 64, ObjCParser.RULE_keyword_declarator);
    var _la = 0; // Token type
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 517;
        _la = this._input.LA(1);
        if(_la===ObjCParser.IDENTIFIER) {
            this.state = 516;
            this.selector();
        }

        this.state = 519;
        this.match(ObjCParser.COLON);
        this.state = 523;
        this._errHandler.sync(this);
        _la = this._input.LA(1);
        while(_la===ObjCParser.LPAREN) {
            this.state = 520;
            this.method_type();
            this.state = 525;
            this._errHandler.sync(this);
            _la = this._input.LA(1);
        }
        this.state = 526;
        this.match(ObjCParser.IDENTIFIER);
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function SelectorContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_selector;
    return this;
}

SelectorContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
SelectorContext.prototype.constructor = SelectorContext;

SelectorContext.prototype.IDENTIFIER = function() {
    return this.getToken(ObjCParser.IDENTIFIER, 0);
};

SelectorContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterSelector(this);
	}
};

SelectorContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitSelector(this);
	}
};




ObjCParser.SelectorContext = SelectorContext;

ObjCParser.prototype.selector = function() {

    var localctx = new SelectorContext(this, this._ctx, this.state);
    this.enterRule(localctx, 66, ObjCParser.RULE_selector);
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 528;
        this.match(ObjCParser.IDENTIFIER);
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Method_typeContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_method_type;
    return this;
}

Method_typeContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Method_typeContext.prototype.constructor = Method_typeContext;

Method_typeContext.prototype.type_name = function() {
    return this.getTypedRuleContext(Type_nameContext,0);
};

Method_typeContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterMethod_type(this);
	}
};

Method_typeContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitMethod_type(this);
	}
};




ObjCParser.Method_typeContext = Method_typeContext;

ObjCParser.prototype.method_type = function() {

    var localctx = new Method_typeContext(this, this._ctx, this.state);
    this.enterRule(localctx, 68, ObjCParser.RULE_method_type);
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 530;
        this.match(ObjCParser.LPAREN);
        this.state = 531;
        this.type_name();
        this.state = 532;
        this.match(ObjCParser.RPAREN);
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Property_implementationContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_property_implementation;
    return this;
}

Property_implementationContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Property_implementationContext.prototype.constructor = Property_implementationContext;

Property_implementationContext.prototype.property_synthesize_list = function() {
    return this.getTypedRuleContext(Property_synthesize_listContext,0);
};

Property_implementationContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterProperty_implementation(this);
	}
};

Property_implementationContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitProperty_implementation(this);
	}
};




ObjCParser.Property_implementationContext = Property_implementationContext;

ObjCParser.prototype.property_implementation = function() {

    var localctx = new Property_implementationContext(this, this._ctx, this.state);
    this.enterRule(localctx, 70, ObjCParser.RULE_property_implementation);
    try {
        this.state = 542;
        switch(this._input.LA(1)) {
        case ObjCParser.SYNTHESIZE:
            this.enterOuterAlt(localctx, 1);
            this.state = 534;
            this.match(ObjCParser.SYNTHESIZE);
            this.state = 535;
            this.property_synthesize_list();
            this.state = 536;
            this.match(ObjCParser.SEMI);
            break;
        case ObjCParser.DYNAMIC:
            this.enterOuterAlt(localctx, 2);
            this.state = 538;
            this.match(ObjCParser.DYNAMIC);
            this.state = 539;
            this.property_synthesize_list();
            this.state = 540;
            this.match(ObjCParser.SEMI);
            break;
        default:
            throw new antlr4.error.NoViableAltException(this);
        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Property_synthesize_listContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_property_synthesize_list;
    return this;
}

Property_synthesize_listContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Property_synthesize_listContext.prototype.constructor = Property_synthesize_listContext;

Property_synthesize_listContext.prototype.property_synthesize_item = function(i) {
    if(i===undefined) {
        i = null;
    }
    if(i===null) {
        return this.getTypedRuleContexts(Property_synthesize_itemContext);
    } else {
        return this.getTypedRuleContext(Property_synthesize_itemContext,i);
    }
};

Property_synthesize_listContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterProperty_synthesize_list(this);
	}
};

Property_synthesize_listContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitProperty_synthesize_list(this);
	}
};




ObjCParser.Property_synthesize_listContext = Property_synthesize_listContext;

ObjCParser.prototype.property_synthesize_list = function() {

    var localctx = new Property_synthesize_listContext(this, this._ctx, this.state);
    this.enterRule(localctx, 72, ObjCParser.RULE_property_synthesize_list);
    var _la = 0; // Token type
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 544;
        this.property_synthesize_item();
        this.state = 549;
        this._errHandler.sync(this);
        _la = this._input.LA(1);
        while(_la===ObjCParser.COMMA) {
            this.state = 545;
            this.match(ObjCParser.COMMA);
            this.state = 546;
            this.property_synthesize_item();
            this.state = 551;
            this._errHandler.sync(this);
            _la = this._input.LA(1);
        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Property_synthesize_itemContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_property_synthesize_item;
    return this;
}

Property_synthesize_itemContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Property_synthesize_itemContext.prototype.constructor = Property_synthesize_itemContext;

Property_synthesize_itemContext.prototype.IDENTIFIER = function(i) {
	if(i===undefined) {
		i = null;
	}
    if(i===null) {
        return this.getTokens(ObjCParser.IDENTIFIER);
    } else {
        return this.getToken(ObjCParser.IDENTIFIER, i);
    }
};


Property_synthesize_itemContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterProperty_synthesize_item(this);
	}
};

Property_synthesize_itemContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitProperty_synthesize_item(this);
	}
};




ObjCParser.Property_synthesize_itemContext = Property_synthesize_itemContext;

ObjCParser.prototype.property_synthesize_item = function() {

    var localctx = new Property_synthesize_itemContext(this, this._ctx, this.state);
    this.enterRule(localctx, 74, ObjCParser.RULE_property_synthesize_item);
    try {
        this.state = 556;
        var la_ = this._interp.adaptivePredict(this._input,43,this._ctx);
        switch(la_) {
        case 1:
            this.enterOuterAlt(localctx, 1);
            this.state = 552;
            this.match(ObjCParser.IDENTIFIER);
            break;

        case 2:
            this.enterOuterAlt(localctx, 2);
            this.state = 553;
            this.match(ObjCParser.IDENTIFIER);
            this.state = 554;
            this.match(ObjCParser.ASSIGN);
            this.state = 555;
            this.match(ObjCParser.IDENTIFIER);
            break;

        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Block_typeContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_block_type;
    return this;
}

Block_typeContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Block_typeContext.prototype.constructor = Block_typeContext;

Block_typeContext.prototype.type_specifier = function(i) {
    if(i===undefined) {
        i = null;
    }
    if(i===null) {
        return this.getTypedRuleContexts(Type_specifierContext);
    } else {
        return this.getTypedRuleContext(Type_specifierContext,i);
    }
};

Block_typeContext.prototype.block_parameters = function() {
    return this.getTypedRuleContext(Block_parametersContext,0);
};

Block_typeContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterBlock_type(this);
	}
};

Block_typeContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitBlock_type(this);
	}
};




ObjCParser.Block_typeContext = Block_typeContext;

ObjCParser.prototype.block_type = function() {

    var localctx = new Block_typeContext(this, this._ctx, this.state);
    this.enterRule(localctx, 76, ObjCParser.RULE_block_type);
    var _la = 0; // Token type
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 558;
        this.type_specifier();
        this.state = 559;
        this.match(ObjCParser.LPAREN);
        this.state = 560;
        this.match(ObjCParser.CARET);
        this.state = 562;
        _la = this._input.LA(1);
        if(((((_la - 31)) & ~0x1f) == 0 && ((1 << (_la - 31)) & ((1 << (ObjCParser.CHAR - 31)) | (1 << (ObjCParser.DOUBLE - 31)) | (1 << (ObjCParser.ENUM - 31)) | (1 << (ObjCParser.FLOAT - 31)) | (1 << (ObjCParser.ID - 31)) | (1 << (ObjCParser.INT - 31)) | (1 << (ObjCParser.LONG - 31)) | (1 << (ObjCParser.SHORT - 31)) | (1 << (ObjCParser.SIGNED - 31)) | (1 << (ObjCParser.STRUCT - 31)) | (1 << (ObjCParser.UNION - 31)) | (1 << (ObjCParser.UNSIGNED - 31)) | (1 << (ObjCParser.VOID - 31)))) !== 0) || _la===ObjCParser.NS_OPTIONS || _la===ObjCParser.NS_ENUM || _la===ObjCParser.IDENTIFIER) {
            this.state = 561;
            this.type_specifier();
        }

        this.state = 564;
        this.match(ObjCParser.RPAREN);
        this.state = 566;
        _la = this._input.LA(1);
        if(_la===ObjCParser.LPAREN) {
            this.state = 565;
            this.block_parameters();
        }

    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Type_specifierContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_type_specifier;
    return this;
}

Type_specifierContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Type_specifierContext.prototype.constructor = Type_specifierContext;

Type_specifierContext.prototype.protocol_reference_list = function() {
    return this.getTypedRuleContext(Protocol_reference_listContext,0);
};

Type_specifierContext.prototype.class_name = function() {
    return this.getTypedRuleContext(Class_nameContext,0);
};

Type_specifierContext.prototype.struct_or_union_specifier = function() {
    return this.getTypedRuleContext(Struct_or_union_specifierContext,0);
};

Type_specifierContext.prototype.enum_specifier = function() {
    return this.getTypedRuleContext(Enum_specifierContext,0);
};

Type_specifierContext.prototype.IDENTIFIER = function() {
    return this.getToken(ObjCParser.IDENTIFIER, 0);
};

Type_specifierContext.prototype.pointer = function() {
    return this.getTypedRuleContext(PointerContext,0);
};

Type_specifierContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterType_specifier(this);
	}
};

Type_specifierContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitType_specifier(this);
	}
};




ObjCParser.Type_specifierContext = Type_specifierContext;

ObjCParser.prototype.type_specifier = function() {

    var localctx = new Type_specifierContext(this, this._ctx, this.state);
    this.enterRule(localctx, 78, ObjCParser.RULE_type_specifier);
    var _la = 0; // Token type
    try {
        this.state = 590;
        var la_ = this._interp.adaptivePredict(this._input,48,this._ctx);
        switch(la_) {
        case 1:
            this.enterOuterAlt(localctx, 1);
            this.state = 568;
            this.match(ObjCParser.VOID);
            break;

        case 2:
            this.enterOuterAlt(localctx, 2);
            this.state = 569;
            this.match(ObjCParser.CHAR);
            break;

        case 3:
            this.enterOuterAlt(localctx, 3);
            this.state = 570;
            this.match(ObjCParser.SHORT);
            break;

        case 4:
            this.enterOuterAlt(localctx, 4);
            this.state = 571;
            this.match(ObjCParser.INT);
            break;

        case 5:
            this.enterOuterAlt(localctx, 5);
            this.state = 572;
            this.match(ObjCParser.LONG);
            break;

        case 6:
            this.enterOuterAlt(localctx, 6);
            this.state = 573;
            this.match(ObjCParser.FLOAT);
            break;

        case 7:
            this.enterOuterAlt(localctx, 7);
            this.state = 574;
            this.match(ObjCParser.DOUBLE);
            break;

        case 8:
            this.enterOuterAlt(localctx, 8);
            this.state = 575;
            this.match(ObjCParser.SIGNED);
            break;

        case 9:
            this.enterOuterAlt(localctx, 9);
            this.state = 576;
            this.match(ObjCParser.UNSIGNED);
            break;

        case 10:
            this.enterOuterAlt(localctx, 10);
            this.state = 577;
            this.match(ObjCParser.ID);
            this.state = 579;
            _la = this._input.LA(1);
            if(_la===ObjCParser.LT) {
                this.state = 578;
                this.protocol_reference_list();
            }

            break;

        case 11:
            this.enterOuterAlt(localctx, 11);
            this.state = 581;
            this.class_name();
            this.state = 583;
            _la = this._input.LA(1);
            if(_la===ObjCParser.LT) {
                this.state = 582;
                this.protocol_reference_list();
            }

            break;

        case 12:
            this.enterOuterAlt(localctx, 12);
            this.state = 585;
            this.struct_or_union_specifier();
            break;

        case 13:
            this.enterOuterAlt(localctx, 13);
            this.state = 586;
            this.enum_specifier();
            break;

        case 14:
            this.enterOuterAlt(localctx, 14);
            this.state = 587;
            this.match(ObjCParser.IDENTIFIER);
            break;

        case 15:
            this.enterOuterAlt(localctx, 15);
            this.state = 588;
            this.match(ObjCParser.IDENTIFIER);
            this.state = 589;
            this.pointer();
            break;

        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Type_qualifierContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_type_qualifier;
    return this;
}

Type_qualifierContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Type_qualifierContext.prototype.constructor = Type_qualifierContext;

Type_qualifierContext.prototype.protocol_qualifier = function() {
    return this.getTypedRuleContext(Protocol_qualifierContext,0);
};

Type_qualifierContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterType_qualifier(this);
	}
};

Type_qualifierContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitType_qualifier(this);
	}
};




ObjCParser.Type_qualifierContext = Type_qualifierContext;

ObjCParser.prototype.type_qualifier = function() {

    var localctx = new Type_qualifierContext(this, this._ctx, this.state);
    this.enterRule(localctx, 80, ObjCParser.RULE_type_qualifier);
    try {
        this.state = 595;
        switch(this._input.LA(1)) {
        case ObjCParser.CONST:
            this.enterOuterAlt(localctx, 1);
            this.state = 592;
            this.match(ObjCParser.CONST);
            break;
        case ObjCParser.VOLATILE:
            this.enterOuterAlt(localctx, 2);
            this.state = 593;
            this.match(ObjCParser.VOLATILE);
            break;
        case ObjCParser.BYCOPY:
        case ObjCParser.BYREF:
        case ObjCParser.IN:
        case ObjCParser.INOUT:
        case ObjCParser.ONEWAY:
        case ObjCParser.OUT:
            this.enterOuterAlt(localctx, 3);
            this.state = 594;
            this.protocol_qualifier();
            break;
        default:
            throw new antlr4.error.NoViableAltException(this);
        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Protocol_qualifierContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_protocol_qualifier;
    return this;
}

Protocol_qualifierContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Protocol_qualifierContext.prototype.constructor = Protocol_qualifierContext;


Protocol_qualifierContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterProtocol_qualifier(this);
	}
};

Protocol_qualifierContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitProtocol_qualifier(this);
	}
};




ObjCParser.Protocol_qualifierContext = Protocol_qualifierContext;

ObjCParser.prototype.protocol_qualifier = function() {

    var localctx = new Protocol_qualifierContext(this, this._ctx, this.state);
    this.enterRule(localctx, 82, ObjCParser.RULE_protocol_qualifier);
    var _la = 0; // Token type
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 597;
        _la = this._input.LA(1);
        if(!(((((_la - 28)) & ~0x1f) == 0 && ((1 << (_la - 28)) & ((1 << (ObjCParser.BYCOPY - 28)) | (1 << (ObjCParser.BYREF - 28)) | (1 << (ObjCParser.IN - 28)) | (1 << (ObjCParser.INOUT - 28)) | (1 << (ObjCParser.ONEWAY - 28)) | (1 << (ObjCParser.OUT - 28)))) !== 0))) {
        this._errHandler.recoverInline(this);
        }
        else {
            this.consume();
        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Primary_expressionContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_primary_expression;
    return this;
}

Primary_expressionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Primary_expressionContext.prototype.constructor = Primary_expressionContext;

Primary_expressionContext.prototype.IDENTIFIER = function() {
    return this.getToken(ObjCParser.IDENTIFIER, 0);
};

Primary_expressionContext.prototype.constant = function() {
    return this.getTypedRuleContext(ConstantContext,0);
};

Primary_expressionContext.prototype.STRING_LITERAL = function() {
    return this.getToken(ObjCParser.STRING_LITERAL, 0);
};

Primary_expressionContext.prototype.expression = function() {
    return this.getTypedRuleContext(ExpressionContext,0);
};

Primary_expressionContext.prototype.message_expression = function() {
    return this.getTypedRuleContext(Message_expressionContext,0);
};

Primary_expressionContext.prototype.selector_expression = function() {
    return this.getTypedRuleContext(Selector_expressionContext,0);
};

Primary_expressionContext.prototype.protocol_expression = function() {
    return this.getTypedRuleContext(Protocol_expressionContext,0);
};

Primary_expressionContext.prototype.encode_expression = function() {
    return this.getTypedRuleContext(Encode_expressionContext,0);
};

Primary_expressionContext.prototype.dictionary_expression = function() {
    return this.getTypedRuleContext(Dictionary_expressionContext,0);
};

Primary_expressionContext.prototype.array_expression = function() {
    return this.getTypedRuleContext(Array_expressionContext,0);
};

Primary_expressionContext.prototype.box_expression = function() {
    return this.getTypedRuleContext(Box_expressionContext,0);
};

Primary_expressionContext.prototype.block_expression = function() {
    return this.getTypedRuleContext(Block_expressionContext,0);
};

Primary_expressionContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterPrimary_expression(this);
	}
};

Primary_expressionContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitPrimary_expression(this);
	}
};




ObjCParser.Primary_expressionContext = Primary_expressionContext;

ObjCParser.prototype.primary_expression = function() {

    var localctx = new Primary_expressionContext(this, this._ctx, this.state);
    this.enterRule(localctx, 84, ObjCParser.RULE_primary_expression);
    try {
        this.state = 616;
        var la_ = this._interp.adaptivePredict(this._input,50,this._ctx);
        switch(la_) {
        case 1:
            this.enterOuterAlt(localctx, 1);
            this.state = 599;
            this.match(ObjCParser.IDENTIFIER);
            break;

        case 2:
            this.enterOuterAlt(localctx, 2);
            this.state = 600;
            this.constant();
            break;

        case 3:
            this.enterOuterAlt(localctx, 3);
            this.state = 601;
            this.match(ObjCParser.STRING_LITERAL);
            break;

        case 4:
            this.enterOuterAlt(localctx, 4);
            this.state = 602;
            this.match(ObjCParser.LPAREN);
            this.state = 603;
            this.expression();
            this.state = 604;
            this.match(ObjCParser.RPAREN);
            break;

        case 5:
            this.enterOuterAlt(localctx, 5);
            this.state = 606;
            this.match(ObjCParser.SELF);
            break;

        case 6:
            this.enterOuterAlt(localctx, 6);
            this.state = 607;
            this.match(ObjCParser.SUPER);
            break;

        case 7:
            this.enterOuterAlt(localctx, 7);
            this.state = 608;
            this.message_expression();
            break;

        case 8:
            this.enterOuterAlt(localctx, 8);
            this.state = 609;
            this.selector_expression();
            break;

        case 9:
            this.enterOuterAlt(localctx, 9);
            this.state = 610;
            this.protocol_expression();
            break;

        case 10:
            this.enterOuterAlt(localctx, 10);
            this.state = 611;
            this.encode_expression();
            break;

        case 11:
            this.enterOuterAlt(localctx, 11);
            this.state = 612;
            this.dictionary_expression();
            break;

        case 12:
            this.enterOuterAlt(localctx, 12);
            this.state = 613;
            this.array_expression();
            break;

        case 13:
            this.enterOuterAlt(localctx, 13);
            this.state = 614;
            this.box_expression();
            break;

        case 14:
            this.enterOuterAlt(localctx, 14);
            this.state = 615;
            this.block_expression();
            break;

        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Dictionary_pairContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_dictionary_pair;
    return this;
}

Dictionary_pairContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Dictionary_pairContext.prototype.constructor = Dictionary_pairContext;

Dictionary_pairContext.prototype.postfix_expression = function(i) {
    if(i===undefined) {
        i = null;
    }
    if(i===null) {
        return this.getTypedRuleContexts(Postfix_expressionContext);
    } else {
        return this.getTypedRuleContext(Postfix_expressionContext,i);
    }
};

Dictionary_pairContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterDictionary_pair(this);
	}
};

Dictionary_pairContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitDictionary_pair(this);
	}
};




ObjCParser.Dictionary_pairContext = Dictionary_pairContext;

ObjCParser.prototype.dictionary_pair = function() {

    var localctx = new Dictionary_pairContext(this, this._ctx, this.state);
    this.enterRule(localctx, 86, ObjCParser.RULE_dictionary_pair);
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 618;
        this.postfix_expression();
        this.state = 619;
        this.match(ObjCParser.COLON);
        this.state = 620;
        this.postfix_expression();
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Dictionary_expressionContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_dictionary_expression;
    return this;
}

Dictionary_expressionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Dictionary_expressionContext.prototype.constructor = Dictionary_expressionContext;

Dictionary_expressionContext.prototype.dictionary_pair = function(i) {
    if(i===undefined) {
        i = null;
    }
    if(i===null) {
        return this.getTypedRuleContexts(Dictionary_pairContext);
    } else {
        return this.getTypedRuleContext(Dictionary_pairContext,i);
    }
};

Dictionary_expressionContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterDictionary_expression(this);
	}
};

Dictionary_expressionContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitDictionary_expression(this);
	}
};




ObjCParser.Dictionary_expressionContext = Dictionary_expressionContext;

ObjCParser.prototype.dictionary_expression = function() {

    var localctx = new Dictionary_expressionContext(this, this._ctx, this.state);
    this.enterRule(localctx, 88, ObjCParser.RULE_dictionary_expression);
    var _la = 0; // Token type
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 622;
        this.match(ObjCParser.AT);
        this.state = 623;
        this.match(ObjCParser.LBRACE);
        this.state = 625;
        _la = this._input.LA(1);
        if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << ObjCParser.ENCODE) | (1 << ObjCParser.PROTOCOL) | (1 << ObjCParser.SELECTOR) | (1 << ObjCParser.SUPER) | (1 << ObjCParser.SELF))) !== 0) || ((((_la - 69)) & ~0x1f) == 0 && ((1 << (_la - 69)) & ((1 << (ObjCParser.LPAREN - 69)) | (1 << (ObjCParser.LBRACK - 69)) | (1 << (ObjCParser.AT - 69)))) !== 0) || ((((_la - 101)) & ~0x1f) == 0 && ((1 << (_la - 101)) & ((1 << (ObjCParser.CARET - 101)) | (1 << (ObjCParser.IDENTIFIER - 101)) | (1 << (ObjCParser.CHARACTER_LITERAL - 101)) | (1 << (ObjCParser.STRING_LITERAL - 101)) | (1 << (ObjCParser.HEX_LITERAL - 101)) | (1 << (ObjCParser.DECIMAL_LITERAL - 101)) | (1 << (ObjCParser.OCTAL_LITERAL - 101)) | (1 << (ObjCParser.FLOATING_POINT_LITERAL - 101)))) !== 0)) {
            this.state = 624;
            this.dictionary_pair();
        }

        this.state = 631;
        this._errHandler.sync(this);
        var _alt = this._interp.adaptivePredict(this._input,52,this._ctx)
        while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) {
            if(_alt===1) {
                this.state = 627;
                this.match(ObjCParser.COMMA);
                this.state = 628;
                this.dictionary_pair(); 
            }
            this.state = 633;
            this._errHandler.sync(this);
            _alt = this._interp.adaptivePredict(this._input,52,this._ctx);
        }

        this.state = 635;
        _la = this._input.LA(1);
        if(_la===ObjCParser.COMMA) {
            this.state = 634;
            this.match(ObjCParser.COMMA);
        }

        this.state = 637;
        this.match(ObjCParser.RBRACE);
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Array_expressionContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_array_expression;
    return this;
}

Array_expressionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Array_expressionContext.prototype.constructor = Array_expressionContext;

Array_expressionContext.prototype.postfix_expression = function(i) {
    if(i===undefined) {
        i = null;
    }
    if(i===null) {
        return this.getTypedRuleContexts(Postfix_expressionContext);
    } else {
        return this.getTypedRuleContext(Postfix_expressionContext,i);
    }
};

Array_expressionContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterArray_expression(this);
	}
};

Array_expressionContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitArray_expression(this);
	}
};




ObjCParser.Array_expressionContext = Array_expressionContext;

ObjCParser.prototype.array_expression = function() {

    var localctx = new Array_expressionContext(this, this._ctx, this.state);
    this.enterRule(localctx, 90, ObjCParser.RULE_array_expression);
    var _la = 0; // Token type
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 639;
        this.match(ObjCParser.AT);
        this.state = 640;
        this.match(ObjCParser.LBRACK);
        this.state = 642;
        _la = this._input.LA(1);
        if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << ObjCParser.ENCODE) | (1 << ObjCParser.PROTOCOL) | (1 << ObjCParser.SELECTOR) | (1 << ObjCParser.SUPER) | (1 << ObjCParser.SELF))) !== 0) || ((((_la - 69)) & ~0x1f) == 0 && ((1 << (_la - 69)) & ((1 << (ObjCParser.LPAREN - 69)) | (1 << (ObjCParser.LBRACK - 69)) | (1 << (ObjCParser.AT - 69)))) !== 0) || ((((_la - 101)) & ~0x1f) == 0 && ((1 << (_la - 101)) & ((1 << (ObjCParser.CARET - 101)) | (1 << (ObjCParser.IDENTIFIER - 101)) | (1 << (ObjCParser.CHARACTER_LITERAL - 101)) | (1 << (ObjCParser.STRING_LITERAL - 101)) | (1 << (ObjCParser.HEX_LITERAL - 101)) | (1 << (ObjCParser.DECIMAL_LITERAL - 101)) | (1 << (ObjCParser.OCTAL_LITERAL - 101)) | (1 << (ObjCParser.FLOATING_POINT_LITERAL - 101)))) !== 0)) {
            this.state = 641;
            this.postfix_expression();
        }

        this.state = 648;
        this._errHandler.sync(this);
        var _alt = this._interp.adaptivePredict(this._input,55,this._ctx)
        while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) {
            if(_alt===1) {
                this.state = 644;
                this.match(ObjCParser.COMMA);
                this.state = 645;
                this.postfix_expression(); 
            }
            this.state = 650;
            this._errHandler.sync(this);
            _alt = this._interp.adaptivePredict(this._input,55,this._ctx);
        }

        this.state = 652;
        _la = this._input.LA(1);
        if(_la===ObjCParser.COMMA) {
            this.state = 651;
            this.match(ObjCParser.COMMA);
        }

        this.state = 654;
        this.match(ObjCParser.RBRACK);
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Box_expressionContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_box_expression;
    return this;
}

Box_expressionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Box_expressionContext.prototype.constructor = Box_expressionContext;

Box_expressionContext.prototype.postfix_expression = function() {
    return this.getTypedRuleContext(Postfix_expressionContext,0);
};

Box_expressionContext.prototype.constant = function() {
    return this.getTypedRuleContext(ConstantContext,0);
};

Box_expressionContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterBox_expression(this);
	}
};

Box_expressionContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitBox_expression(this);
	}
};




ObjCParser.Box_expressionContext = Box_expressionContext;

ObjCParser.prototype.box_expression = function() {

    var localctx = new Box_expressionContext(this, this._ctx, this.state);
    this.enterRule(localctx, 92, ObjCParser.RULE_box_expression);
    try {
        this.state = 663;
        var la_ = this._interp.adaptivePredict(this._input,57,this._ctx);
        switch(la_) {
        case 1:
            this.enterOuterAlt(localctx, 1);
            this.state = 656;
            this.match(ObjCParser.AT);
            this.state = 657;
            this.match(ObjCParser.LPAREN);
            this.state = 658;
            this.postfix_expression();
            this.state = 659;
            this.match(ObjCParser.RPAREN);
            break;

        case 2:
            this.enterOuterAlt(localctx, 2);
            this.state = 661;
            this.match(ObjCParser.AT);
            this.state = 662;
            this.constant();
            break;

        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Block_parametersContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_block_parameters;
    return this;
}

Block_parametersContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Block_parametersContext.prototype.constructor = Block_parametersContext;

Block_parametersContext.prototype.type_variable_declarator = function(i) {
    if(i===undefined) {
        i = null;
    }
    if(i===null) {
        return this.getTypedRuleContexts(Type_variable_declaratorContext);
    } else {
        return this.getTypedRuleContext(Type_variable_declaratorContext,i);
    }
};

Block_parametersContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterBlock_parameters(this);
	}
};

Block_parametersContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitBlock_parameters(this);
	}
};




ObjCParser.Block_parametersContext = Block_parametersContext;

ObjCParser.prototype.block_parameters = function() {

    var localctx = new Block_parametersContext(this, this._ctx, this.state);
    this.enterRule(localctx, 94, ObjCParser.RULE_block_parameters);
    var _la = 0; // Token type
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 665;
        this.match(ObjCParser.LPAREN);
        this.state = 668;
        var la_ = this._interp.adaptivePredict(this._input,58,this._ctx);
        if(la_===1) {
            this.state = 666;
            this.type_variable_declarator();

        } else if(la_===2) {
            this.state = 667;
            this.match(ObjCParser.VOID);

        }
        this.state = 674;
        this._errHandler.sync(this);
        _la = this._input.LA(1);
        while(_la===ObjCParser.COMMA) {
            this.state = 670;
            this.match(ObjCParser.COMMA);
            this.state = 671;
            this.type_variable_declarator();
            this.state = 676;
            this._errHandler.sync(this);
            _la = this._input.LA(1);
        }
        this.state = 677;
        this.match(ObjCParser.RPAREN);
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Block_expressionContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_block_expression;
    return this;
}

Block_expressionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Block_expressionContext.prototype.constructor = Block_expressionContext;

Block_expressionContext.prototype.compound_statement = function() {
    return this.getTypedRuleContext(Compound_statementContext,0);
};

Block_expressionContext.prototype.type_specifier = function() {
    return this.getTypedRuleContext(Type_specifierContext,0);
};

Block_expressionContext.prototype.block_parameters = function() {
    return this.getTypedRuleContext(Block_parametersContext,0);
};

Block_expressionContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterBlock_expression(this);
	}
};

Block_expressionContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitBlock_expression(this);
	}
};




ObjCParser.Block_expressionContext = Block_expressionContext;

ObjCParser.prototype.block_expression = function() {

    var localctx = new Block_expressionContext(this, this._ctx, this.state);
    this.enterRule(localctx, 96, ObjCParser.RULE_block_expression);
    var _la = 0; // Token type
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 679;
        this.match(ObjCParser.CARET);
        this.state = 681;
        _la = this._input.LA(1);
        if(((((_la - 31)) & ~0x1f) == 0 && ((1 << (_la - 31)) & ((1 << (ObjCParser.CHAR - 31)) | (1 << (ObjCParser.DOUBLE - 31)) | (1 << (ObjCParser.ENUM - 31)) | (1 << (ObjCParser.FLOAT - 31)) | (1 << (ObjCParser.ID - 31)) | (1 << (ObjCParser.INT - 31)) | (1 << (ObjCParser.LONG - 31)) | (1 << (ObjCParser.SHORT - 31)) | (1 << (ObjCParser.SIGNED - 31)) | (1 << (ObjCParser.STRUCT - 31)) | (1 << (ObjCParser.UNION - 31)) | (1 << (ObjCParser.UNSIGNED - 31)) | (1 << (ObjCParser.VOID - 31)))) !== 0) || _la===ObjCParser.NS_OPTIONS || _la===ObjCParser.NS_ENUM || _la===ObjCParser.IDENTIFIER) {
            this.state = 680;
            this.type_specifier();
        }

        this.state = 684;
        _la = this._input.LA(1);
        if(_la===ObjCParser.LPAREN) {
            this.state = 683;
            this.block_parameters();
        }

        this.state = 686;
        this.compound_statement();
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Message_expressionContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_message_expression;
    return this;
}

Message_expressionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Message_expressionContext.prototype.constructor = Message_expressionContext;

Message_expressionContext.prototype.receiver = function() {
    return this.getTypedRuleContext(ReceiverContext,0);
};

Message_expressionContext.prototype.message_selector = function() {
    return this.getTypedRuleContext(Message_selectorContext,0);
};

Message_expressionContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterMessage_expression(this);
	}
};

Message_expressionContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitMessage_expression(this);
	}
};




ObjCParser.Message_expressionContext = Message_expressionContext;

ObjCParser.prototype.message_expression = function() {

    var localctx = new Message_expressionContext(this, this._ctx, this.state);
    this.enterRule(localctx, 98, ObjCParser.RULE_message_expression);
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 688;
        this.match(ObjCParser.LBRACK);
        this.state = 689;
        this.receiver();
        this.state = 690;
        this.message_selector();
        this.state = 691;
        this.match(ObjCParser.RBRACK);
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function ReceiverContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_receiver;
    return this;
}

ReceiverContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
ReceiverContext.prototype.constructor = ReceiverContext;

ReceiverContext.prototype.expression = function() {
    return this.getTypedRuleContext(ExpressionContext,0);
};

ReceiverContext.prototype.class_name = function() {
    return this.getTypedRuleContext(Class_nameContext,0);
};

ReceiverContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterReceiver(this);
	}
};

ReceiverContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitReceiver(this);
	}
};




ObjCParser.ReceiverContext = ReceiverContext;

ObjCParser.prototype.receiver = function() {

    var localctx = new ReceiverContext(this, this._ctx, this.state);
    this.enterRule(localctx, 100, ObjCParser.RULE_receiver);
    try {
        this.state = 696;
        var la_ = this._interp.adaptivePredict(this._input,62,this._ctx);
        switch(la_) {
        case 1:
            this.enterOuterAlt(localctx, 1);
            this.state = 693;
            this.expression();
            break;

        case 2:
            this.enterOuterAlt(localctx, 2);
            this.state = 694;
            this.class_name();
            break;

        case 3:
            this.enterOuterAlt(localctx, 3);
            this.state = 695;
            this.match(ObjCParser.SUPER);
            break;

        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Message_selectorContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_message_selector;
    return this;
}

Message_selectorContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Message_selectorContext.prototype.constructor = Message_selectorContext;

Message_selectorContext.prototype.selector = function() {
    return this.getTypedRuleContext(SelectorContext,0);
};

Message_selectorContext.prototype.keyword_argument = function(i) {
    if(i===undefined) {
        i = null;
    }
    if(i===null) {
        return this.getTypedRuleContexts(Keyword_argumentContext);
    } else {
        return this.getTypedRuleContext(Keyword_argumentContext,i);
    }
};

Message_selectorContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterMessage_selector(this);
	}
};

Message_selectorContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitMessage_selector(this);
	}
};




ObjCParser.Message_selectorContext = Message_selectorContext;

ObjCParser.prototype.message_selector = function() {

    var localctx = new Message_selectorContext(this, this._ctx, this.state);
    this.enterRule(localctx, 102, ObjCParser.RULE_message_selector);
    var _la = 0; // Token type
    try {
        this.state = 704;
        var la_ = this._interp.adaptivePredict(this._input,64,this._ctx);
        switch(la_) {
        case 1:
            this.enterOuterAlt(localctx, 1);
            this.state = 698;
            this.selector();
            break;

        case 2:
            this.enterOuterAlt(localctx, 2);
            this.state = 700; 
            this._errHandler.sync(this);
            _la = this._input.LA(1);
            do {
                this.state = 699;
                this.keyword_argument();
                this.state = 702; 
                this._errHandler.sync(this);
                _la = this._input.LA(1);
            } while(_la===ObjCParser.COLON || _la===ObjCParser.IDENTIFIER);
            break;

        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Keyword_argumentContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_keyword_argument;
    return this;
}

Keyword_argumentContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Keyword_argumentContext.prototype.constructor = Keyword_argumentContext;

Keyword_argumentContext.prototype.expression = function() {
    return this.getTypedRuleContext(ExpressionContext,0);
};

Keyword_argumentContext.prototype.selector = function() {
    return this.getTypedRuleContext(SelectorContext,0);
};

Keyword_argumentContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterKeyword_argument(this);
	}
};

Keyword_argumentContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitKeyword_argument(this);
	}
};




ObjCParser.Keyword_argumentContext = Keyword_argumentContext;

ObjCParser.prototype.keyword_argument = function() {

    var localctx = new Keyword_argumentContext(this, this._ctx, this.state);
    this.enterRule(localctx, 104, ObjCParser.RULE_keyword_argument);
    var _la = 0; // Token type
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 707;
        _la = this._input.LA(1);
        if(_la===ObjCParser.IDENTIFIER) {
            this.state = 706;
            this.selector();
        }

        this.state = 709;
        this.match(ObjCParser.COLON);
        this.state = 710;
        this.expression();
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Selector_expressionContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_selector_expression;
    return this;
}

Selector_expressionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Selector_expressionContext.prototype.constructor = Selector_expressionContext;

Selector_expressionContext.prototype.selector_name = function() {
    return this.getTypedRuleContext(Selector_nameContext,0);
};

Selector_expressionContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterSelector_expression(this);
	}
};

Selector_expressionContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitSelector_expression(this);
	}
};




ObjCParser.Selector_expressionContext = Selector_expressionContext;

ObjCParser.prototype.selector_expression = function() {

    var localctx = new Selector_expressionContext(this, this._ctx, this.state);
    this.enterRule(localctx, 106, ObjCParser.RULE_selector_expression);
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 712;
        this.match(ObjCParser.SELECTOR);
        this.state = 713;
        this.match(ObjCParser.LPAREN);
        this.state = 714;
        this.selector_name();
        this.state = 715;
        this.match(ObjCParser.RPAREN);
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Selector_nameContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_selector_name;
    return this;
}

Selector_nameContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Selector_nameContext.prototype.constructor = Selector_nameContext;

Selector_nameContext.prototype.selector = function(i) {
    if(i===undefined) {
        i = null;
    }
    if(i===null) {
        return this.getTypedRuleContexts(SelectorContext);
    } else {
        return this.getTypedRuleContext(SelectorContext,i);
    }
};

Selector_nameContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterSelector_name(this);
	}
};

Selector_nameContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitSelector_name(this);
	}
};




ObjCParser.Selector_nameContext = Selector_nameContext;

ObjCParser.prototype.selector_name = function() {

    var localctx = new Selector_nameContext(this, this._ctx, this.state);
    this.enterRule(localctx, 108, ObjCParser.RULE_selector_name);
    var _la = 0; // Token type
    try {
        this.state = 726;
        var la_ = this._interp.adaptivePredict(this._input,68,this._ctx);
        switch(la_) {
        case 1:
            this.enterOuterAlt(localctx, 1);
            this.state = 717;
            this.selector();
            break;

        case 2:
            this.enterOuterAlt(localctx, 2);
            this.state = 722; 
            this._errHandler.sync(this);
            _la = this._input.LA(1);
            do {
                this.state = 719;
                _la = this._input.LA(1);
                if(_la===ObjCParser.IDENTIFIER) {
                    this.state = 718;
                    this.selector();
                }

                this.state = 721;
                this.match(ObjCParser.COLON);
                this.state = 724; 
                this._errHandler.sync(this);
                _la = this._input.LA(1);
            } while(_la===ObjCParser.COLON || _la===ObjCParser.IDENTIFIER);
            break;

        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Protocol_expressionContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_protocol_expression;
    return this;
}

Protocol_expressionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Protocol_expressionContext.prototype.constructor = Protocol_expressionContext;

Protocol_expressionContext.prototype.protocol_name = function() {
    return this.getTypedRuleContext(Protocol_nameContext,0);
};

Protocol_expressionContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterProtocol_expression(this);
	}
};

Protocol_expressionContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitProtocol_expression(this);
	}
};




ObjCParser.Protocol_expressionContext = Protocol_expressionContext;

ObjCParser.prototype.protocol_expression = function() {

    var localctx = new Protocol_expressionContext(this, this._ctx, this.state);
    this.enterRule(localctx, 110, ObjCParser.RULE_protocol_expression);
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 728;
        this.match(ObjCParser.PROTOCOL);
        this.state = 729;
        this.match(ObjCParser.LPAREN);
        this.state = 730;
        this.protocol_name();
        this.state = 731;
        this.match(ObjCParser.RPAREN);
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Encode_expressionContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_encode_expression;
    return this;
}

Encode_expressionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Encode_expressionContext.prototype.constructor = Encode_expressionContext;

Encode_expressionContext.prototype.type_name = function() {
    return this.getTypedRuleContext(Type_nameContext,0);
};

Encode_expressionContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterEncode_expression(this);
	}
};

Encode_expressionContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitEncode_expression(this);
	}
};




ObjCParser.Encode_expressionContext = Encode_expressionContext;

ObjCParser.prototype.encode_expression = function() {

    var localctx = new Encode_expressionContext(this, this._ctx, this.state);
    this.enterRule(localctx, 112, ObjCParser.RULE_encode_expression);
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 733;
        this.match(ObjCParser.ENCODE);
        this.state = 734;
        this.match(ObjCParser.LPAREN);
        this.state = 735;
        this.type_name();
        this.state = 736;
        this.match(ObjCParser.RPAREN);
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Type_variable_declaratorContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_type_variable_declarator;
    return this;
}

Type_variable_declaratorContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Type_variable_declaratorContext.prototype.constructor = Type_variable_declaratorContext;

Type_variable_declaratorContext.prototype.declaration_specifiers = function() {
    return this.getTypedRuleContext(Declaration_specifiersContext,0);
};

Type_variable_declaratorContext.prototype.declarator = function() {
    return this.getTypedRuleContext(DeclaratorContext,0);
};

Type_variable_declaratorContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterType_variable_declarator(this);
	}
};

Type_variable_declaratorContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitType_variable_declarator(this);
	}
};




ObjCParser.Type_variable_declaratorContext = Type_variable_declaratorContext;

ObjCParser.prototype.type_variable_declarator = function() {

    var localctx = new Type_variable_declaratorContext(this, this._ctx, this.state);
    this.enterRule(localctx, 114, ObjCParser.RULE_type_variable_declarator);
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 738;
        this.declaration_specifiers();
        this.state = 739;
        this.declarator();
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Try_statementContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_try_statement;
    return this;
}

Try_statementContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Try_statementContext.prototype.constructor = Try_statementContext;

Try_statementContext.prototype.compound_statement = function() {
    return this.getTypedRuleContext(Compound_statementContext,0);
};

Try_statementContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterTry_statement(this);
	}
};

Try_statementContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitTry_statement(this);
	}
};




ObjCParser.Try_statementContext = Try_statementContext;

ObjCParser.prototype.try_statement = function() {

    var localctx = new Try_statementContext(this, this._ctx, this.state);
    this.enterRule(localctx, 116, ObjCParser.RULE_try_statement);
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 741;
        this.match(ObjCParser.TRY);
        this.state = 742;
        this.compound_statement();
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Catch_statementContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_catch_statement;
    return this;
}

Catch_statementContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Catch_statementContext.prototype.constructor = Catch_statementContext;

Catch_statementContext.prototype.type_variable_declarator = function() {
    return this.getTypedRuleContext(Type_variable_declaratorContext,0);
};

Catch_statementContext.prototype.compound_statement = function() {
    return this.getTypedRuleContext(Compound_statementContext,0);
};

Catch_statementContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterCatch_statement(this);
	}
};

Catch_statementContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitCatch_statement(this);
	}
};




ObjCParser.Catch_statementContext = Catch_statementContext;

ObjCParser.prototype.catch_statement = function() {

    var localctx = new Catch_statementContext(this, this._ctx, this.state);
    this.enterRule(localctx, 118, ObjCParser.RULE_catch_statement);
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 744;
        this.match(ObjCParser.CATCH);
        this.state = 745;
        this.match(ObjCParser.LPAREN);
        this.state = 746;
        this.type_variable_declarator();
        this.state = 747;
        this.match(ObjCParser.RPAREN);
        this.state = 748;
        this.compound_statement();
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Finally_statementContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_finally_statement;
    return this;
}

Finally_statementContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Finally_statementContext.prototype.constructor = Finally_statementContext;

Finally_statementContext.prototype.compound_statement = function() {
    return this.getTypedRuleContext(Compound_statementContext,0);
};

Finally_statementContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterFinally_statement(this);
	}
};

Finally_statementContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitFinally_statement(this);
	}
};




ObjCParser.Finally_statementContext = Finally_statementContext;

ObjCParser.prototype.finally_statement = function() {

    var localctx = new Finally_statementContext(this, this._ctx, this.state);
    this.enterRule(localctx, 120, ObjCParser.RULE_finally_statement);
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 750;
        this.match(ObjCParser.FINALLY);
        this.state = 751;
        this.compound_statement();
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Throw_statementContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_throw_statement;
    return this;
}

Throw_statementContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Throw_statementContext.prototype.constructor = Throw_statementContext;

Throw_statementContext.prototype.IDENTIFIER = function() {
    return this.getToken(ObjCParser.IDENTIFIER, 0);
};

Throw_statementContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterThrow_statement(this);
	}
};

Throw_statementContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitThrow_statement(this);
	}
};




ObjCParser.Throw_statementContext = Throw_statementContext;

ObjCParser.prototype.throw_statement = function() {

    var localctx = new Throw_statementContext(this, this._ctx, this.state);
    this.enterRule(localctx, 122, ObjCParser.RULE_throw_statement);
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 753;
        this.match(ObjCParser.THROW);
        this.state = 754;
        this.match(ObjCParser.LPAREN);
        this.state = 755;
        this.match(ObjCParser.IDENTIFIER);
        this.state = 756;
        this.match(ObjCParser.RPAREN);
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Try_blockContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_try_block;
    return this;
}

Try_blockContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Try_blockContext.prototype.constructor = Try_blockContext;

Try_blockContext.prototype.try_statement = function() {
    return this.getTypedRuleContext(Try_statementContext,0);
};

Try_blockContext.prototype.catch_statement = function(i) {
    if(i===undefined) {
        i = null;
    }
    if(i===null) {
        return this.getTypedRuleContexts(Catch_statementContext);
    } else {
        return this.getTypedRuleContext(Catch_statementContext,i);
    }
};

Try_blockContext.prototype.finally_statement = function() {
    return this.getTypedRuleContext(Finally_statementContext,0);
};

Try_blockContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterTry_block(this);
	}
};

Try_blockContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitTry_block(this);
	}
};




ObjCParser.Try_blockContext = Try_blockContext;

ObjCParser.prototype.try_block = function() {

    var localctx = new Try_blockContext(this, this._ctx, this.state);
    this.enterRule(localctx, 124, ObjCParser.RULE_try_block);
    var _la = 0; // Token type
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 758;
        this.try_statement();
        this.state = 762;
        this._errHandler.sync(this);
        _la = this._input.LA(1);
        while(_la===ObjCParser.CATCH) {
            this.state = 759;
            this.catch_statement();
            this.state = 764;
            this._errHandler.sync(this);
            _la = this._input.LA(1);
        }
        this.state = 766;
        _la = this._input.LA(1);
        if(_la===ObjCParser.FINALLY) {
            this.state = 765;
            this.finally_statement();
        }

    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Synchronized_statementContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_synchronized_statement;
    return this;
}

Synchronized_statementContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Synchronized_statementContext.prototype.constructor = Synchronized_statementContext;

Synchronized_statementContext.prototype.primary_expression = function() {
    return this.getTypedRuleContext(Primary_expressionContext,0);
};

Synchronized_statementContext.prototype.compound_statement = function() {
    return this.getTypedRuleContext(Compound_statementContext,0);
};

Synchronized_statementContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterSynchronized_statement(this);
	}
};

Synchronized_statementContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitSynchronized_statement(this);
	}
};




ObjCParser.Synchronized_statementContext = Synchronized_statementContext;

ObjCParser.prototype.synchronized_statement = function() {

    var localctx = new Synchronized_statementContext(this, this._ctx, this.state);
    this.enterRule(localctx, 126, ObjCParser.RULE_synchronized_statement);
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 768;
        this.match(ObjCParser.SYNCHRONIZED);
        this.state = 769;
        this.match(ObjCParser.LPAREN);
        this.state = 770;
        this.primary_expression();
        this.state = 771;
        this.match(ObjCParser.RPAREN);
        this.state = 772;
        this.compound_statement();
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Autorelease_statementContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_autorelease_statement;
    return this;
}

Autorelease_statementContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Autorelease_statementContext.prototype.constructor = Autorelease_statementContext;

Autorelease_statementContext.prototype.compound_statement = function() {
    return this.getTypedRuleContext(Compound_statementContext,0);
};

Autorelease_statementContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterAutorelease_statement(this);
	}
};

Autorelease_statementContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitAutorelease_statement(this);
	}
};




ObjCParser.Autorelease_statementContext = Autorelease_statementContext;

ObjCParser.prototype.autorelease_statement = function() {

    var localctx = new Autorelease_statementContext(this, this._ctx, this.state);
    this.enterRule(localctx, 128, ObjCParser.RULE_autorelease_statement);
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 774;
        this.match(ObjCParser.AUTORELEASEPOOL);
        this.state = 775;
        this.compound_statement();
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Function_definitionContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_function_definition;
    return this;
}

Function_definitionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Function_definitionContext.prototype.constructor = Function_definitionContext;

Function_definitionContext.prototype.declarator = function() {
    return this.getTypedRuleContext(DeclaratorContext,0);
};

Function_definitionContext.prototype.compound_statement = function() {
    return this.getTypedRuleContext(Compound_statementContext,0);
};

Function_definitionContext.prototype.declaration_specifiers = function() {
    return this.getTypedRuleContext(Declaration_specifiersContext,0);
};

Function_definitionContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterFunction_definition(this);
	}
};

Function_definitionContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitFunction_definition(this);
	}
};




ObjCParser.Function_definitionContext = Function_definitionContext;

ObjCParser.prototype.function_definition = function() {

    var localctx = new Function_definitionContext(this, this._ctx, this.state);
    this.enterRule(localctx, 130, ObjCParser.RULE_function_definition);
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 778;
        var la_ = this._interp.adaptivePredict(this._input,71,this._ctx);
        if(la_===1) {
            this.state = 777;
            this.declaration_specifiers();

        }
        this.state = 780;
        this.declarator();
        this.state = 781;
        this.compound_statement();
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function DeclarationContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_declaration;
    return this;
}

DeclarationContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
DeclarationContext.prototype.constructor = DeclarationContext;

DeclarationContext.prototype.declaration_specifiers = function() {
    return this.getTypedRuleContext(Declaration_specifiersContext,0);
};

DeclarationContext.prototype.init_declarator_list = function() {
    return this.getTypedRuleContext(Init_declarator_listContext,0);
};

DeclarationContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterDeclaration(this);
	}
};

DeclarationContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitDeclaration(this);
	}
};




ObjCParser.DeclarationContext = DeclarationContext;

ObjCParser.prototype.declaration = function() {

    var localctx = new DeclarationContext(this, this._ctx, this.state);
    this.enterRule(localctx, 132, ObjCParser.RULE_declaration);
    var _la = 0; // Token type
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 783;
        this.declaration_specifiers();
        this.state = 785;
        _la = this._input.LA(1);
        if(_la===ObjCParser.LPAREN || _la===ObjCParser.MUL || _la===ObjCParser.IDENTIFIER) {
            this.state = 784;
            this.init_declarator_list();
        }

        this.state = 787;
        this.match(ObjCParser.SEMI);
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Declaration_specifiersContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_declaration_specifiers;
    return this;
}

Declaration_specifiersContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Declaration_specifiersContext.prototype.constructor = Declaration_specifiersContext;

Declaration_specifiersContext.prototype.arc_behaviour_specifier = function(i) {
    if(i===undefined) {
        i = null;
    }
    if(i===null) {
        return this.getTypedRuleContexts(Arc_behaviour_specifierContext);
    } else {
        return this.getTypedRuleContext(Arc_behaviour_specifierContext,i);
    }
};

Declaration_specifiersContext.prototype.storage_class_specifier = function(i) {
    if(i===undefined) {
        i = null;
    }
    if(i===null) {
        return this.getTypedRuleContexts(Storage_class_specifierContext);
    } else {
        return this.getTypedRuleContext(Storage_class_specifierContext,i);
    }
};

Declaration_specifiersContext.prototype.type_specifier = function(i) {
    if(i===undefined) {
        i = null;
    }
    if(i===null) {
        return this.getTypedRuleContexts(Type_specifierContext);
    } else {
        return this.getTypedRuleContext(Type_specifierContext,i);
    }
};

Declaration_specifiersContext.prototype.type_qualifier = function(i) {
    if(i===undefined) {
        i = null;
    }
    if(i===null) {
        return this.getTypedRuleContexts(Type_qualifierContext);
    } else {
        return this.getTypedRuleContext(Type_qualifierContext,i);
    }
};

Declaration_specifiersContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterDeclaration_specifiers(this);
	}
};

Declaration_specifiersContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitDeclaration_specifiers(this);
	}
};




ObjCParser.Declaration_specifiersContext = Declaration_specifiersContext;

ObjCParser.prototype.declaration_specifiers = function() {

    var localctx = new Declaration_specifiersContext(this, this._ctx, this.state);
    this.enterRule(localctx, 134, ObjCParser.RULE_declaration_specifiers);
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 793; 
        this._errHandler.sync(this);
        var _alt = 1;
        do {
        	switch (_alt) {
        	case 1:
        		this.state = 793;
        		switch(this._input.LA(1)) {
        		case ObjCParser.WWEAK:
        		case ObjCParser.WUNSAFE_UNRETAINED:
        		    this.state = 789;
        		    this.arc_behaviour_specifier();
        		    break;
        		case ObjCParser.AUTO:
        		case ObjCParser.EXTERN:
        		case ObjCParser.REGISTER:
        		case ObjCParser.STATIC:
        		case ObjCParser.TYPEDEF:
        		    this.state = 790;
        		    this.storage_class_specifier();
        		    break;
        		case ObjCParser.CHAR:
        		case ObjCParser.DOUBLE:
        		case ObjCParser.ENUM:
        		case ObjCParser.FLOAT:
        		case ObjCParser.ID:
        		case ObjCParser.INT:
        		case ObjCParser.LONG:
        		case ObjCParser.SHORT:
        		case ObjCParser.SIGNED:
        		case ObjCParser.STRUCT:
        		case ObjCParser.UNION:
        		case ObjCParser.UNSIGNED:
        		case ObjCParser.VOID:
        		case ObjCParser.NS_OPTIONS:
        		case ObjCParser.NS_ENUM:
        		case ObjCParser.IDENTIFIER:
        		    this.state = 791;
        		    this.type_specifier();
        		    break;
        		case ObjCParser.BYCOPY:
        		case ObjCParser.BYREF:
        		case ObjCParser.CONST:
        		case ObjCParser.IN:
        		case ObjCParser.INOUT:
        		case ObjCParser.ONEWAY:
        		case ObjCParser.OUT:
        		case ObjCParser.VOLATILE:
        		    this.state = 792;
        		    this.type_qualifier();
        		    break;
        		default:
        		    throw new antlr4.error.NoViableAltException(this);
        		}
        		break;
        	default:
        		throw new antlr4.error.NoViableAltException(this);
        	}
        	this.state = 795; 
        	this._errHandler.sync(this);
        	_alt = this._interp.adaptivePredict(this._input,74, this._ctx);
        } while ( _alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER );
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Arc_behaviour_specifierContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_arc_behaviour_specifier;
    return this;
}

Arc_behaviour_specifierContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Arc_behaviour_specifierContext.prototype.constructor = Arc_behaviour_specifierContext;


Arc_behaviour_specifierContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterArc_behaviour_specifier(this);
	}
};

Arc_behaviour_specifierContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitArc_behaviour_specifier(this);
	}
};




ObjCParser.Arc_behaviour_specifierContext = Arc_behaviour_specifierContext;

ObjCParser.prototype.arc_behaviour_specifier = function() {

    var localctx = new Arc_behaviour_specifierContext(this, this._ctx, this.state);
    this.enterRule(localctx, 136, ObjCParser.RULE_arc_behaviour_specifier);
    var _la = 0; // Token type
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 797;
        _la = this._input.LA(1);
        if(!(_la===ObjCParser.WWEAK || _la===ObjCParser.WUNSAFE_UNRETAINED)) {
        this._errHandler.recoverInline(this);
        }
        else {
            this.consume();
        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Storage_class_specifierContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_storage_class_specifier;
    return this;
}

Storage_class_specifierContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Storage_class_specifierContext.prototype.constructor = Storage_class_specifierContext;


Storage_class_specifierContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterStorage_class_specifier(this);
	}
};

Storage_class_specifierContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitStorage_class_specifier(this);
	}
};




ObjCParser.Storage_class_specifierContext = Storage_class_specifierContext;

ObjCParser.prototype.storage_class_specifier = function() {

    var localctx = new Storage_class_specifierContext(this, this._ctx, this.state);
    this.enterRule(localctx, 138, ObjCParser.RULE_storage_class_specifier);
    var _la = 0; // Token type
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 799;
        _la = this._input.LA(1);
        if(!(_la===ObjCParser.AUTO || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (ObjCParser.EXTERN - 39)) | (1 << (ObjCParser.REGISTER - 39)) | (1 << (ObjCParser.STATIC - 39)) | (1 << (ObjCParser.TYPEDEF - 39)))) !== 0))) {
        this._errHandler.recoverInline(this);
        }
        else {
            this.consume();
        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Init_declarator_listContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_init_declarator_list;
    return this;
}

Init_declarator_listContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Init_declarator_listContext.prototype.constructor = Init_declarator_listContext;

Init_declarator_listContext.prototype.init_declarator = function(i) {
    if(i===undefined) {
        i = null;
    }
    if(i===null) {
        return this.getTypedRuleContexts(Init_declaratorContext);
    } else {
        return this.getTypedRuleContext(Init_declaratorContext,i);
    }
};

Init_declarator_listContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterInit_declarator_list(this);
	}
};

Init_declarator_listContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitInit_declarator_list(this);
	}
};




ObjCParser.Init_declarator_listContext = Init_declarator_listContext;

ObjCParser.prototype.init_declarator_list = function() {

    var localctx = new Init_declarator_listContext(this, this._ctx, this.state);
    this.enterRule(localctx, 140, ObjCParser.RULE_init_declarator_list);
    var _la = 0; // Token type
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 801;
        this.init_declarator();
        this.state = 806;
        this._errHandler.sync(this);
        _la = this._input.LA(1);
        while(_la===ObjCParser.COMMA) {
            this.state = 802;
            this.match(ObjCParser.COMMA);
            this.state = 803;
            this.init_declarator();
            this.state = 808;
            this._errHandler.sync(this);
            _la = this._input.LA(1);
        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Init_declaratorContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_init_declarator;
    return this;
}

Init_declaratorContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Init_declaratorContext.prototype.constructor = Init_declaratorContext;

Init_declaratorContext.prototype.declarator = function() {
    return this.getTypedRuleContext(DeclaratorContext,0);
};

Init_declaratorContext.prototype.initializer = function() {
    return this.getTypedRuleContext(InitializerContext,0);
};

Init_declaratorContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterInit_declarator(this);
	}
};

Init_declaratorContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitInit_declarator(this);
	}
};




ObjCParser.Init_declaratorContext = Init_declaratorContext;

ObjCParser.prototype.init_declarator = function() {

    var localctx = new Init_declaratorContext(this, this._ctx, this.state);
    this.enterRule(localctx, 142, ObjCParser.RULE_init_declarator);
    var _la = 0; // Token type
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 809;
        this.declarator();
        this.state = 812;
        _la = this._input.LA(1);
        if(_la===ObjCParser.ASSIGN) {
            this.state = 810;
            this.match(ObjCParser.ASSIGN);
            this.state = 811;
            this.initializer();
        }

    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Struct_or_union_specifierContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_struct_or_union_specifier;
    return this;
}

Struct_or_union_specifierContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Struct_or_union_specifierContext.prototype.constructor = Struct_or_union_specifierContext;

Struct_or_union_specifierContext.prototype.IDENTIFIER = function() {
    return this.getToken(ObjCParser.IDENTIFIER, 0);
};

Struct_or_union_specifierContext.prototype.struct_declaration = function(i) {
    if(i===undefined) {
        i = null;
    }
    if(i===null) {
        return this.getTypedRuleContexts(Struct_declarationContext);
    } else {
        return this.getTypedRuleContext(Struct_declarationContext,i);
    }
};

Struct_or_union_specifierContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterStruct_or_union_specifier(this);
	}
};

Struct_or_union_specifierContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitStruct_or_union_specifier(this);
	}
};




ObjCParser.Struct_or_union_specifierContext = Struct_or_union_specifierContext;

ObjCParser.prototype.struct_or_union_specifier = function() {

    var localctx = new Struct_or_union_specifierContext(this, this._ctx, this.state);
    this.enterRule(localctx, 144, ObjCParser.RULE_struct_or_union_specifier);
    var _la = 0; // Token type
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 814;
        _la = this._input.LA(1);
        if(!(_la===ObjCParser.STRUCT || _la===ObjCParser.UNION)) {
        this._errHandler.recoverInline(this);
        }
        else {
            this.consume();
        }
        this.state = 827;
        var la_ = this._interp.adaptivePredict(this._input,79,this._ctx);
        switch(la_) {
        case 1:
            this.state = 815;
            this.match(ObjCParser.IDENTIFIER);
            break;

        case 2:
            this.state = 817;
            _la = this._input.LA(1);
            if(_la===ObjCParser.IDENTIFIER) {
                this.state = 816;
                this.match(ObjCParser.IDENTIFIER);
            }

            this.state = 819;
            this.match(ObjCParser.LBRACE);
            this.state = 821; 
            this._errHandler.sync(this);
            _la = this._input.LA(1);
            do {
                this.state = 820;
                this.struct_declaration();
                this.state = 823; 
                this._errHandler.sync(this);
                _la = this._input.LA(1);
            } while(((((_la - 28)) & ~0x1f) == 0 && ((1 << (_la - 28)) & ((1 << (ObjCParser.BYCOPY - 28)) | (1 << (ObjCParser.BYREF - 28)) | (1 << (ObjCParser.CHAR - 28)) | (1 << (ObjCParser.CONST - 28)) | (1 << (ObjCParser.DOUBLE - 28)) | (1 << (ObjCParser.ENUM - 28)) | (1 << (ObjCParser.FLOAT - 28)) | (1 << (ObjCParser.ID - 28)) | (1 << (ObjCParser.IN - 28)) | (1 << (ObjCParser.INOUT - 28)) | (1 << (ObjCParser.INT - 28)) | (1 << (ObjCParser.LONG - 28)) | (1 << (ObjCParser.ONEWAY - 28)) | (1 << (ObjCParser.OUT - 28)) | (1 << (ObjCParser.SHORT - 28)) | (1 << (ObjCParser.SIGNED - 28)) | (1 << (ObjCParser.STRUCT - 28)))) !== 0) || ((((_la - 60)) & ~0x1f) == 0 && ((1 << (_la - 60)) & ((1 << (ObjCParser.UNION - 60)) | (1 << (ObjCParser.UNSIGNED - 60)) | (1 << (ObjCParser.VOID - 60)) | (1 << (ObjCParser.VOLATILE - 60)) | (1 << (ObjCParser.NS_OPTIONS - 60)) | (1 << (ObjCParser.NS_ENUM - 60)) | (1 << (ObjCParser.WWEAK - 60)) | (1 << (ObjCParser.WUNSAFE_UNRETAINED - 60)))) !== 0) || _la===ObjCParser.IDENTIFIER);
            this.state = 825;
            this.match(ObjCParser.RBRACE);
            break;

        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Struct_declarationContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_struct_declaration;
    return this;
}

Struct_declarationContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Struct_declarationContext.prototype.constructor = Struct_declarationContext;

Struct_declarationContext.prototype.specifier_qualifier_list = function() {
    return this.getTypedRuleContext(Specifier_qualifier_listContext,0);
};

Struct_declarationContext.prototype.struct_declarator_list = function() {
    return this.getTypedRuleContext(Struct_declarator_listContext,0);
};

Struct_declarationContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterStruct_declaration(this);
	}
};

Struct_declarationContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitStruct_declaration(this);
	}
};




ObjCParser.Struct_declarationContext = Struct_declarationContext;

ObjCParser.prototype.struct_declaration = function() {

    var localctx = new Struct_declarationContext(this, this._ctx, this.state);
    this.enterRule(localctx, 146, ObjCParser.RULE_struct_declaration);
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 829;
        this.specifier_qualifier_list();
        this.state = 830;
        this.struct_declarator_list();
        this.state = 831;
        this.match(ObjCParser.SEMI);
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Specifier_qualifier_listContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_specifier_qualifier_list;
    return this;
}

Specifier_qualifier_listContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Specifier_qualifier_listContext.prototype.constructor = Specifier_qualifier_listContext;

Specifier_qualifier_listContext.prototype.arc_behaviour_specifier = function(i) {
    if(i===undefined) {
        i = null;
    }
    if(i===null) {
        return this.getTypedRuleContexts(Arc_behaviour_specifierContext);
    } else {
        return this.getTypedRuleContext(Arc_behaviour_specifierContext,i);
    }
};

Specifier_qualifier_listContext.prototype.type_specifier = function(i) {
    if(i===undefined) {
        i = null;
    }
    if(i===null) {
        return this.getTypedRuleContexts(Type_specifierContext);
    } else {
        return this.getTypedRuleContext(Type_specifierContext,i);
    }
};

Specifier_qualifier_listContext.prototype.type_qualifier = function(i) {
    if(i===undefined) {
        i = null;
    }
    if(i===null) {
        return this.getTypedRuleContexts(Type_qualifierContext);
    } else {
        return this.getTypedRuleContext(Type_qualifierContext,i);
    }
};

Specifier_qualifier_listContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterSpecifier_qualifier_list(this);
	}
};

Specifier_qualifier_listContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitSpecifier_qualifier_list(this);
	}
};




ObjCParser.Specifier_qualifier_listContext = Specifier_qualifier_listContext;

ObjCParser.prototype.specifier_qualifier_list = function() {

    var localctx = new Specifier_qualifier_listContext(this, this._ctx, this.state);
    this.enterRule(localctx, 148, ObjCParser.RULE_specifier_qualifier_list);
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 836; 
        this._errHandler.sync(this);
        var _alt = 1;
        do {
        	switch (_alt) {
        	case 1:
        		this.state = 836;
        		switch(this._input.LA(1)) {
        		case ObjCParser.WWEAK:
        		case ObjCParser.WUNSAFE_UNRETAINED:
        		    this.state = 833;
        		    this.arc_behaviour_specifier();
        		    break;
        		case ObjCParser.CHAR:
        		case ObjCParser.DOUBLE:
        		case ObjCParser.ENUM:
        		case ObjCParser.FLOAT:
        		case ObjCParser.ID:
        		case ObjCParser.INT:
        		case ObjCParser.LONG:
        		case ObjCParser.SHORT:
        		case ObjCParser.SIGNED:
        		case ObjCParser.STRUCT:
        		case ObjCParser.UNION:
        		case ObjCParser.UNSIGNED:
        		case ObjCParser.VOID:
        		case ObjCParser.NS_OPTIONS:
        		case ObjCParser.NS_ENUM:
        		case ObjCParser.IDENTIFIER:
        		    this.state = 834;
        		    this.type_specifier();
        		    break;
        		case ObjCParser.BYCOPY:
        		case ObjCParser.BYREF:
        		case ObjCParser.CONST:
        		case ObjCParser.IN:
        		case ObjCParser.INOUT:
        		case ObjCParser.ONEWAY:
        		case ObjCParser.OUT:
        		case ObjCParser.VOLATILE:
        		    this.state = 835;
        		    this.type_qualifier();
        		    break;
        		default:
        		    throw new antlr4.error.NoViableAltException(this);
        		}
        		break;
        	default:
        		throw new antlr4.error.NoViableAltException(this);
        	}
        	this.state = 838; 
        	this._errHandler.sync(this);
        	_alt = this._interp.adaptivePredict(this._input,81, this._ctx);
        } while ( _alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER );
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Struct_declarator_listContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_struct_declarator_list;
    return this;
}

Struct_declarator_listContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Struct_declarator_listContext.prototype.constructor = Struct_declarator_listContext;

Struct_declarator_listContext.prototype.struct_declarator = function(i) {
    if(i===undefined) {
        i = null;
    }
    if(i===null) {
        return this.getTypedRuleContexts(Struct_declaratorContext);
    } else {
        return this.getTypedRuleContext(Struct_declaratorContext,i);
    }
};

Struct_declarator_listContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterStruct_declarator_list(this);
	}
};

Struct_declarator_listContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitStruct_declarator_list(this);
	}
};




ObjCParser.Struct_declarator_listContext = Struct_declarator_listContext;

ObjCParser.prototype.struct_declarator_list = function() {

    var localctx = new Struct_declarator_listContext(this, this._ctx, this.state);
    this.enterRule(localctx, 150, ObjCParser.RULE_struct_declarator_list);
    var _la = 0; // Token type
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 840;
        this.struct_declarator();
        this.state = 845;
        this._errHandler.sync(this);
        _la = this._input.LA(1);
        while(_la===ObjCParser.COMMA) {
            this.state = 841;
            this.match(ObjCParser.COMMA);
            this.state = 842;
            this.struct_declarator();
            this.state = 847;
            this._errHandler.sync(this);
            _la = this._input.LA(1);
        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Struct_declaratorContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_struct_declarator;
    return this;
}

Struct_declaratorContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Struct_declaratorContext.prototype.constructor = Struct_declaratorContext;

Struct_declaratorContext.prototype.declarator = function() {
    return this.getTypedRuleContext(DeclaratorContext,0);
};

Struct_declaratorContext.prototype.constant = function() {
    return this.getTypedRuleContext(ConstantContext,0);
};

Struct_declaratorContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterStruct_declarator(this);
	}
};

Struct_declaratorContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitStruct_declarator(this);
	}
};




ObjCParser.Struct_declaratorContext = Struct_declaratorContext;

ObjCParser.prototype.struct_declarator = function() {

    var localctx = new Struct_declaratorContext(this, this._ctx, this.state);
    this.enterRule(localctx, 152, ObjCParser.RULE_struct_declarator);
    var _la = 0; // Token type
    try {
        this.state = 854;
        var la_ = this._interp.adaptivePredict(this._input,84,this._ctx);
        switch(la_) {
        case 1:
            this.enterOuterAlt(localctx, 1);
            this.state = 848;
            this.declarator();
            break;

        case 2:
            this.enterOuterAlt(localctx, 2);
            this.state = 850;
            _la = this._input.LA(1);
            if(_la===ObjCParser.LPAREN || _la===ObjCParser.MUL || _la===ObjCParser.IDENTIFIER) {
                this.state = 849;
                this.declarator();
            }

            this.state = 852;
            this.match(ObjCParser.COLON);
            this.state = 853;
            this.constant();
            break;

        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Enum_specifierContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_enum_specifier;
    return this;
}

Enum_specifierContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Enum_specifierContext.prototype.constructor = Enum_specifierContext;

Enum_specifierContext.prototype.identifier = function() {
    return this.getTypedRuleContext(IdentifierContext,0);
};

Enum_specifierContext.prototype.enumerator_list = function() {
    return this.getTypedRuleContext(Enumerator_listContext,0);
};

Enum_specifierContext.prototype.type_name = function() {
    return this.getTypedRuleContext(Type_nameContext,0);
};

Enum_specifierContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterEnum_specifier(this);
	}
};

Enum_specifierContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitEnum_specifier(this);
	}
};




ObjCParser.Enum_specifierContext = Enum_specifierContext;

ObjCParser.prototype.enum_specifier = function() {

    var localctx = new Enum_specifierContext(this, this._ctx, this.state);
    this.enterRule(localctx, 154, ObjCParser.RULE_enum_specifier);
    var _la = 0; // Token type
    try {
        this.state = 894;
        switch(this._input.LA(1)) {
        case ObjCParser.ENUM:
            this.enterOuterAlt(localctx, 1);
            this.state = 856;
            this.match(ObjCParser.ENUM);
            this.state = 859;
            _la = this._input.LA(1);
            if(_la===ObjCParser.COLON) {
                this.state = 857;
                this.match(ObjCParser.COLON);
                this.state = 858;
                this.type_name();
            }

            this.state = 872;
            switch(this._input.LA(1)) {
            case ObjCParser.IDENTIFIER:
                this.state = 861;
                this.identifier();
                this.state = 866;
                var la_ = this._interp.adaptivePredict(this._input,86,this._ctx);
                if(la_===1) {
                    this.state = 862;
                    this.match(ObjCParser.LBRACE);
                    this.state = 863;
                    this.enumerator_list();
                    this.state = 864;
                    this.match(ObjCParser.RBRACE);

                }
                break;
            case ObjCParser.LBRACE:
                this.state = 868;
                this.match(ObjCParser.LBRACE);
                this.state = 869;
                this.enumerator_list();
                this.state = 870;
                this.match(ObjCParser.RBRACE);
                break;
            default:
                throw new antlr4.error.NoViableAltException(this);
            }
            break;
        case ObjCParser.NS_OPTIONS:
            this.enterOuterAlt(localctx, 2);
            this.state = 874;
            this.match(ObjCParser.NS_OPTIONS);
            this.state = 875;
            this.match(ObjCParser.LPAREN);
            this.state = 876;
            this.type_name();
            this.state = 877;
            this.match(ObjCParser.COMMA);
            this.state = 878;
            this.identifier();
            this.state = 879;
            this.match(ObjCParser.RPAREN);
            this.state = 880;
            this.match(ObjCParser.LBRACE);
            this.state = 881;
            this.enumerator_list();
            this.state = 882;
            this.match(ObjCParser.RBRACE);
            break;
        case ObjCParser.NS_ENUM:
            this.enterOuterAlt(localctx, 3);
            this.state = 884;
            this.match(ObjCParser.NS_ENUM);
            this.state = 885;
            this.match(ObjCParser.LPAREN);
            this.state = 886;
            this.type_name();
            this.state = 887;
            this.match(ObjCParser.COMMA);
            this.state = 888;
            this.identifier();
            this.state = 889;
            this.match(ObjCParser.RPAREN);
            this.state = 890;
            this.match(ObjCParser.LBRACE);
            this.state = 891;
            this.enumerator_list();
            this.state = 892;
            this.match(ObjCParser.RBRACE);
            break;
        default:
            throw new antlr4.error.NoViableAltException(this);
        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Enumerator_listContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_enumerator_list;
    return this;
}

Enumerator_listContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Enumerator_listContext.prototype.constructor = Enumerator_listContext;

Enumerator_listContext.prototype.enumerator = function(i) {
    if(i===undefined) {
        i = null;
    }
    if(i===null) {
        return this.getTypedRuleContexts(EnumeratorContext);
    } else {
        return this.getTypedRuleContext(EnumeratorContext,i);
    }
};

Enumerator_listContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterEnumerator_list(this);
	}
};

Enumerator_listContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitEnumerator_list(this);
	}
};




ObjCParser.Enumerator_listContext = Enumerator_listContext;

ObjCParser.prototype.enumerator_list = function() {

    var localctx = new Enumerator_listContext(this, this._ctx, this.state);
    this.enterRule(localctx, 156, ObjCParser.RULE_enumerator_list);
    var _la = 0; // Token type
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 896;
        this.enumerator();
        this.state = 901;
        this._errHandler.sync(this);
        var _alt = this._interp.adaptivePredict(this._input,89,this._ctx)
        while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) {
            if(_alt===1) {
                this.state = 897;
                this.match(ObjCParser.COMMA);
                this.state = 898;
                this.enumerator(); 
            }
            this.state = 903;
            this._errHandler.sync(this);
            _alt = this._interp.adaptivePredict(this._input,89,this._ctx);
        }

        this.state = 905;
        _la = this._input.LA(1);
        if(_la===ObjCParser.COMMA) {
            this.state = 904;
            this.match(ObjCParser.COMMA);
        }

    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function EnumeratorContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_enumerator;
    return this;
}

EnumeratorContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
EnumeratorContext.prototype.constructor = EnumeratorContext;

EnumeratorContext.prototype.identifier = function() {
    return this.getTypedRuleContext(IdentifierContext,0);
};

EnumeratorContext.prototype.constant_expression = function() {
    return this.getTypedRuleContext(Constant_expressionContext,0);
};

EnumeratorContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterEnumerator(this);
	}
};

EnumeratorContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitEnumerator(this);
	}
};




ObjCParser.EnumeratorContext = EnumeratorContext;

ObjCParser.prototype.enumerator = function() {

    var localctx = new EnumeratorContext(this, this._ctx, this.state);
    this.enterRule(localctx, 158, ObjCParser.RULE_enumerator);
    var _la = 0; // Token type
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 907;
        this.identifier();
        this.state = 910;
        _la = this._input.LA(1);
        if(_la===ObjCParser.ASSIGN) {
            this.state = 908;
            this.match(ObjCParser.ASSIGN);
            this.state = 909;
            this.constant_expression();
        }

    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function PointerContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_pointer;
    return this;
}

PointerContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
PointerContext.prototype.constructor = PointerContext;

PointerContext.prototype.declaration_specifiers = function() {
    return this.getTypedRuleContext(Declaration_specifiersContext,0);
};

PointerContext.prototype.pointer = function() {
    return this.getTypedRuleContext(PointerContext,0);
};

PointerContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterPointer(this);
	}
};

PointerContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitPointer(this);
	}
};




ObjCParser.PointerContext = PointerContext;

ObjCParser.prototype.pointer = function() {

    var localctx = new PointerContext(this, this._ctx, this.state);
    this.enterRule(localctx, 160, ObjCParser.RULE_pointer);
    var _la = 0; // Token type
    try {
        this.state = 921;
        var la_ = this._interp.adaptivePredict(this._input,94,this._ctx);
        switch(la_) {
        case 1:
            this.enterOuterAlt(localctx, 1);
            this.state = 912;
            this.match(ObjCParser.MUL);
            this.state = 914;
            var la_ = this._interp.adaptivePredict(this._input,92,this._ctx);
            if(la_===1) {
                this.state = 913;
                this.declaration_specifiers();

            }
            break;

        case 2:
            this.enterOuterAlt(localctx, 2);
            this.state = 916;
            this.match(ObjCParser.MUL);
            this.state = 918;
            _la = this._input.LA(1);
            if(((((_la - 25)) & ~0x1f) == 0 && ((1 << (_la - 25)) & ((1 << (ObjCParser.AUTO - 25)) | (1 << (ObjCParser.BYCOPY - 25)) | (1 << (ObjCParser.BYREF - 25)) | (1 << (ObjCParser.CHAR - 25)) | (1 << (ObjCParser.CONST - 25)) | (1 << (ObjCParser.DOUBLE - 25)) | (1 << (ObjCParser.ENUM - 25)) | (1 << (ObjCParser.EXTERN - 25)) | (1 << (ObjCParser.FLOAT - 25)) | (1 << (ObjCParser.ID - 25)) | (1 << (ObjCParser.IN - 25)) | (1 << (ObjCParser.INOUT - 25)) | (1 << (ObjCParser.INT - 25)) | (1 << (ObjCParser.LONG - 25)) | (1 << (ObjCParser.ONEWAY - 25)) | (1 << (ObjCParser.OUT - 25)) | (1 << (ObjCParser.REGISTER - 25)) | (1 << (ObjCParser.SHORT - 25)) | (1 << (ObjCParser.SIGNED - 25)) | (1 << (ObjCParser.STATIC - 25)))) !== 0) || ((((_la - 57)) & ~0x1f) == 0 && ((1 << (_la - 57)) & ((1 << (ObjCParser.STRUCT - 57)) | (1 << (ObjCParser.TYPEDEF - 57)) | (1 << (ObjCParser.UNION - 57)) | (1 << (ObjCParser.UNSIGNED - 57)) | (1 << (ObjCParser.VOID - 57)) | (1 << (ObjCParser.VOLATILE - 57)) | (1 << (ObjCParser.NS_OPTIONS - 57)) | (1 << (ObjCParser.NS_ENUM - 57)) | (1 << (ObjCParser.WWEAK - 57)) | (1 << (ObjCParser.WUNSAFE_UNRETAINED - 57)))) !== 0) || _la===ObjCParser.IDENTIFIER) {
                this.state = 917;
                this.declaration_specifiers();
            }

            this.state = 920;
            this.pointer();
            break;

        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function DeclaratorContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_declarator;
    return this;
}

DeclaratorContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
DeclaratorContext.prototype.constructor = DeclaratorContext;

DeclaratorContext.prototype.direct_declarator = function() {
    return this.getTypedRuleContext(Direct_declaratorContext,0);
};

DeclaratorContext.prototype.pointer = function() {
    return this.getTypedRuleContext(PointerContext,0);
};

DeclaratorContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterDeclarator(this);
	}
};

DeclaratorContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitDeclarator(this);
	}
};




ObjCParser.DeclaratorContext = DeclaratorContext;

ObjCParser.prototype.declarator = function() {

    var localctx = new DeclaratorContext(this, this._ctx, this.state);
    this.enterRule(localctx, 162, ObjCParser.RULE_declarator);
    var _la = 0; // Token type
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 924;
        _la = this._input.LA(1);
        if(_la===ObjCParser.MUL) {
            this.state = 923;
            this.pointer();
        }

        this.state = 926;
        this.direct_declarator();
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Direct_declaratorContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_direct_declarator;
    return this;
}

Direct_declaratorContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Direct_declaratorContext.prototype.constructor = Direct_declaratorContext;

Direct_declaratorContext.prototype.identifier = function() {
    return this.getTypedRuleContext(IdentifierContext,0);
};

Direct_declaratorContext.prototype.declarator_suffix = function(i) {
    if(i===undefined) {
        i = null;
    }
    if(i===null) {
        return this.getTypedRuleContexts(Declarator_suffixContext);
    } else {
        return this.getTypedRuleContext(Declarator_suffixContext,i);
    }
};

Direct_declaratorContext.prototype.declarator = function() {
    return this.getTypedRuleContext(DeclaratorContext,0);
};

Direct_declaratorContext.prototype.block_parameters = function() {
    return this.getTypedRuleContext(Block_parametersContext,0);
};

Direct_declaratorContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterDirect_declarator(this);
	}
};

Direct_declaratorContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitDirect_declarator(this);
	}
};




ObjCParser.Direct_declaratorContext = Direct_declaratorContext;

ObjCParser.prototype.direct_declarator = function() {

    var localctx = new Direct_declaratorContext(this, this._ctx, this.state);
    this.enterRule(localctx, 164, ObjCParser.RULE_direct_declarator);
    var _la = 0; // Token type
    try {
        this.state = 951;
        var la_ = this._interp.adaptivePredict(this._input,99,this._ctx);
        switch(la_) {
        case 1:
            this.enterOuterAlt(localctx, 1);
            this.state = 928;
            this.identifier();
            this.state = 932;
            this._errHandler.sync(this);
            var _alt = this._interp.adaptivePredict(this._input,96,this._ctx)
            while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) {
                if(_alt===1) {
                    this.state = 929;
                    this.declarator_suffix(); 
                }
                this.state = 934;
                this._errHandler.sync(this);
                _alt = this._interp.adaptivePredict(this._input,96,this._ctx);
            }

            break;

        case 2:
            this.enterOuterAlt(localctx, 2);
            this.state = 935;
            this.match(ObjCParser.LPAREN);
            this.state = 936;
            this.declarator();
            this.state = 937;
            this.match(ObjCParser.RPAREN);
            this.state = 941;
            this._errHandler.sync(this);
            var _alt = this._interp.adaptivePredict(this._input,97,this._ctx)
            while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) {
                if(_alt===1) {
                    this.state = 938;
                    this.declarator_suffix(); 
                }
                this.state = 943;
                this._errHandler.sync(this);
                _alt = this._interp.adaptivePredict(this._input,97,this._ctx);
            }

            break;

        case 3:
            this.enterOuterAlt(localctx, 3);
            this.state = 944;
            this.match(ObjCParser.LPAREN);
            this.state = 945;
            this.match(ObjCParser.CARET);
            this.state = 947;
            _la = this._input.LA(1);
            if(_la===ObjCParser.IDENTIFIER) {
                this.state = 946;
                this.identifier();
            }

            this.state = 949;
            this.match(ObjCParser.RPAREN);
            this.state = 950;
            this.block_parameters();
            break;

        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Declarator_suffixContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_declarator_suffix;
    return this;
}

Declarator_suffixContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Declarator_suffixContext.prototype.constructor = Declarator_suffixContext;

Declarator_suffixContext.prototype.constant_expression = function() {
    return this.getTypedRuleContext(Constant_expressionContext,0);
};

Declarator_suffixContext.prototype.parameter_list = function() {
    return this.getTypedRuleContext(Parameter_listContext,0);
};

Declarator_suffixContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterDeclarator_suffix(this);
	}
};

Declarator_suffixContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitDeclarator_suffix(this);
	}
};




ObjCParser.Declarator_suffixContext = Declarator_suffixContext;

ObjCParser.prototype.declarator_suffix = function() {

    var localctx = new Declarator_suffixContext(this, this._ctx, this.state);
    this.enterRule(localctx, 166, ObjCParser.RULE_declarator_suffix);
    var _la = 0; // Token type
    try {
        this.state = 963;
        switch(this._input.LA(1)) {
        case ObjCParser.LBRACK:
            this.enterOuterAlt(localctx, 1);
            this.state = 953;
            this.match(ObjCParser.LBRACK);
            this.state = 955;
            _la = this._input.LA(1);
            if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << ObjCParser.ENCODE) | (1 << ObjCParser.PROTOCOL) | (1 << ObjCParser.SELECTOR) | (1 << ObjCParser.SUPER) | (1 << ObjCParser.SELF))) !== 0) || ((((_la - 55)) & ~0x1f) == 0 && ((1 << (_la - 55)) & ((1 << (ObjCParser.SIZEOF - 55)) | (1 << (ObjCParser.LPAREN - 55)) | (1 << (ObjCParser.LBRACK - 55)) | (1 << (ObjCParser.AT - 55)) | (1 << (ObjCParser.BANG - 55)) | (1 << (ObjCParser.TILDE - 55)))) !== 0) || ((((_la - 93)) & ~0x1f) == 0 && ((1 << (_la - 93)) & ((1 << (ObjCParser.INC - 93)) | (1 << (ObjCParser.DEC - 93)) | (1 << (ObjCParser.SUB - 93)) | (1 << (ObjCParser.MUL - 93)) | (1 << (ObjCParser.BITAND - 93)) | (1 << (ObjCParser.CARET - 93)))) !== 0) || ((((_la - 125)) & ~0x1f) == 0 && ((1 << (_la - 125)) & ((1 << (ObjCParser.IDENTIFIER - 125)) | (1 << (ObjCParser.CHARACTER_LITERAL - 125)) | (1 << (ObjCParser.STRING_LITERAL - 125)) | (1 << (ObjCParser.HEX_LITERAL - 125)) | (1 << (ObjCParser.DECIMAL_LITERAL - 125)) | (1 << (ObjCParser.OCTAL_LITERAL - 125)) | (1 << (ObjCParser.FLOATING_POINT_LITERAL - 125)))) !== 0)) {
                this.state = 954;
                this.constant_expression();
            }

            this.state = 957;
            this.match(ObjCParser.RBRACK);
            break;
        case ObjCParser.LPAREN:
            this.enterOuterAlt(localctx, 2);
            this.state = 958;
            this.match(ObjCParser.LPAREN);
            this.state = 960;
            _la = this._input.LA(1);
            if(((((_la - 25)) & ~0x1f) == 0 && ((1 << (_la - 25)) & ((1 << (ObjCParser.AUTO - 25)) | (1 << (ObjCParser.BYCOPY - 25)) | (1 << (ObjCParser.BYREF - 25)) | (1 << (ObjCParser.CHAR - 25)) | (1 << (ObjCParser.CONST - 25)) | (1 << (ObjCParser.DOUBLE - 25)) | (1 << (ObjCParser.ENUM - 25)) | (1 << (ObjCParser.EXTERN - 25)) | (1 << (ObjCParser.FLOAT - 25)) | (1 << (ObjCParser.ID - 25)) | (1 << (ObjCParser.IN - 25)) | (1 << (ObjCParser.INOUT - 25)) | (1 << (ObjCParser.INT - 25)) | (1 << (ObjCParser.LONG - 25)) | (1 << (ObjCParser.ONEWAY - 25)) | (1 << (ObjCParser.OUT - 25)) | (1 << (ObjCParser.REGISTER - 25)) | (1 << (ObjCParser.SHORT - 25)) | (1 << (ObjCParser.SIGNED - 25)) | (1 << (ObjCParser.STATIC - 25)))) !== 0) || ((((_la - 57)) & ~0x1f) == 0 && ((1 << (_la - 57)) & ((1 << (ObjCParser.STRUCT - 57)) | (1 << (ObjCParser.TYPEDEF - 57)) | (1 << (ObjCParser.UNION - 57)) | (1 << (ObjCParser.UNSIGNED - 57)) | (1 << (ObjCParser.VOID - 57)) | (1 << (ObjCParser.VOLATILE - 57)) | (1 << (ObjCParser.NS_OPTIONS - 57)) | (1 << (ObjCParser.NS_ENUM - 57)) | (1 << (ObjCParser.WWEAK - 57)) | (1 << (ObjCParser.WUNSAFE_UNRETAINED - 57)))) !== 0) || _la===ObjCParser.IDENTIFIER) {
                this.state = 959;
                this.parameter_list();
            }

            this.state = 962;
            this.match(ObjCParser.RPAREN);
            break;
        default:
            throw new antlr4.error.NoViableAltException(this);
        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Parameter_listContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_parameter_list;
    return this;
}

Parameter_listContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Parameter_listContext.prototype.constructor = Parameter_listContext;

Parameter_listContext.prototype.parameter_declaration_list = function() {
    return this.getTypedRuleContext(Parameter_declaration_listContext,0);
};

Parameter_listContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterParameter_list(this);
	}
};

Parameter_listContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitParameter_list(this);
	}
};




ObjCParser.Parameter_listContext = Parameter_listContext;

ObjCParser.prototype.parameter_list = function() {

    var localctx = new Parameter_listContext(this, this._ctx, this.state);
    this.enterRule(localctx, 168, ObjCParser.RULE_parameter_list);
    var _la = 0; // Token type
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 965;
        this.parameter_declaration_list();
        this.state = 968;
        _la = this._input.LA(1);
        if(_la===ObjCParser.COMMA) {
            this.state = 966;
            this.match(ObjCParser.COMMA);
            this.state = 967;
            this.match(ObjCParser.ELIPSIS);
        }

    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Parameter_declarationContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_parameter_declaration;
    return this;
}

Parameter_declarationContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Parameter_declarationContext.prototype.constructor = Parameter_declarationContext;

Parameter_declarationContext.prototype.declaration_specifiers = function() {
    return this.getTypedRuleContext(Declaration_specifiersContext,0);
};

Parameter_declarationContext.prototype.abstract_declarator = function() {
    return this.getTypedRuleContext(Abstract_declaratorContext,0);
};

Parameter_declarationContext.prototype.declarator = function() {
    return this.getTypedRuleContext(DeclaratorContext,0);
};

Parameter_declarationContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterParameter_declaration(this);
	}
};

Parameter_declarationContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitParameter_declaration(this);
	}
};




ObjCParser.Parameter_declarationContext = Parameter_declarationContext;

ObjCParser.prototype.parameter_declaration = function() {

    var localctx = new Parameter_declarationContext(this, this._ctx, this.state);
    this.enterRule(localctx, 170, ObjCParser.RULE_parameter_declaration);
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 970;
        this.declaration_specifiers();
        this.state = 975;
        var la_ = this._interp.adaptivePredict(this._input,105,this._ctx);
        switch(la_) {
        case 1:
            this.state = 972;
            var la_ = this._interp.adaptivePredict(this._input,104,this._ctx);
            if(la_===1) {
                this.state = 971;
                this.declarator();

            }
            break;

        case 2:
            this.state = 974;
            this.abstract_declarator();
            break;

        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function InitializerContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_initializer;
    return this;
}

InitializerContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
InitializerContext.prototype.constructor = InitializerContext;

InitializerContext.prototype.assignment_expression = function() {
    return this.getTypedRuleContext(Assignment_expressionContext,0);
};

InitializerContext.prototype.initializer = function(i) {
    if(i===undefined) {
        i = null;
    }
    if(i===null) {
        return this.getTypedRuleContexts(InitializerContext);
    } else {
        return this.getTypedRuleContext(InitializerContext,i);
    }
};

InitializerContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterInitializer(this);
	}
};

InitializerContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitInitializer(this);
	}
};




ObjCParser.InitializerContext = InitializerContext;

ObjCParser.prototype.initializer = function() {

    var localctx = new InitializerContext(this, this._ctx, this.state);
    this.enterRule(localctx, 172, ObjCParser.RULE_initializer);
    var _la = 0; // Token type
    try {
        this.state = 992;
        switch(this._input.LA(1)) {
        case ObjCParser.ENCODE:
        case ObjCParser.PROTOCOL:
        case ObjCParser.SELECTOR:
        case ObjCParser.SUPER:
        case ObjCParser.SELF:
        case ObjCParser.SIZEOF:
        case ObjCParser.LPAREN:
        case ObjCParser.LBRACK:
        case ObjCParser.AT:
        case ObjCParser.BANG:
        case ObjCParser.TILDE:
        case ObjCParser.INC:
        case ObjCParser.DEC:
        case ObjCParser.SUB:
        case ObjCParser.MUL:
        case ObjCParser.BITAND:
        case ObjCParser.CARET:
        case ObjCParser.IDENTIFIER:
        case ObjCParser.CHARACTER_LITERAL:
        case ObjCParser.STRING_LITERAL:
        case ObjCParser.HEX_LITERAL:
        case ObjCParser.DECIMAL_LITERAL:
        case ObjCParser.OCTAL_LITERAL:
        case ObjCParser.FLOATING_POINT_LITERAL:
            this.enterOuterAlt(localctx, 1);
            this.state = 977;
            this.assignment_expression();
            break;
        case ObjCParser.LBRACE:
            this.enterOuterAlt(localctx, 2);
            this.state = 978;
            this.match(ObjCParser.LBRACE);
            this.state = 979;
            this.initializer();
            this.state = 984;
            this._errHandler.sync(this);
            var _alt = this._interp.adaptivePredict(this._input,106,this._ctx)
            while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) {
                if(_alt===1) {
                    this.state = 980;
                    this.match(ObjCParser.COMMA);
                    this.state = 981;
                    this.initializer(); 
                }
                this.state = 986;
                this._errHandler.sync(this);
                _alt = this._interp.adaptivePredict(this._input,106,this._ctx);
            }

            this.state = 988;
            _la = this._input.LA(1);
            if(_la===ObjCParser.COMMA) {
                this.state = 987;
                this.match(ObjCParser.COMMA);
            }

            this.state = 990;
            this.match(ObjCParser.RBRACE);
            break;
        default:
            throw new antlr4.error.NoViableAltException(this);
        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Type_nameContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_type_name;
    return this;
}

Type_nameContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Type_nameContext.prototype.constructor = Type_nameContext;

Type_nameContext.prototype.specifier_qualifier_list = function() {
    return this.getTypedRuleContext(Specifier_qualifier_listContext,0);
};

Type_nameContext.prototype.abstract_declarator = function() {
    return this.getTypedRuleContext(Abstract_declaratorContext,0);
};

Type_nameContext.prototype.block_type = function() {
    return this.getTypedRuleContext(Block_typeContext,0);
};

Type_nameContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterType_name(this);
	}
};

Type_nameContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitType_name(this);
	}
};




ObjCParser.Type_nameContext = Type_nameContext;

ObjCParser.prototype.type_name = function() {

    var localctx = new Type_nameContext(this, this._ctx, this.state);
    this.enterRule(localctx, 174, ObjCParser.RULE_type_name);
    try {
        this.state = 998;
        var la_ = this._interp.adaptivePredict(this._input,109,this._ctx);
        switch(la_) {
        case 1:
            this.enterOuterAlt(localctx, 1);
            this.state = 994;
            this.specifier_qualifier_list();
            this.state = 995;
            this.abstract_declarator();
            break;

        case 2:
            this.enterOuterAlt(localctx, 2);
            this.state = 997;
            this.block_type();
            break;

        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Abstract_declaratorContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_abstract_declarator;
    return this;
}

Abstract_declaratorContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Abstract_declaratorContext.prototype.constructor = Abstract_declaratorContext;

Abstract_declaratorContext.prototype.pointer = function() {
    return this.getTypedRuleContext(PointerContext,0);
};

Abstract_declaratorContext.prototype.abstract_declarator = function() {
    return this.getTypedRuleContext(Abstract_declaratorContext,0);
};

Abstract_declaratorContext.prototype.abstract_declarator_suffix = function(i) {
    if(i===undefined) {
        i = null;
    }
    if(i===null) {
        return this.getTypedRuleContexts(Abstract_declarator_suffixContext);
    } else {
        return this.getTypedRuleContext(Abstract_declarator_suffixContext,i);
    }
};

Abstract_declaratorContext.prototype.constant_expression = function(i) {
    if(i===undefined) {
        i = null;
    }
    if(i===null) {
        return this.getTypedRuleContexts(Constant_expressionContext);
    } else {
        return this.getTypedRuleContext(Constant_expressionContext,i);
    }
};

Abstract_declaratorContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterAbstract_declarator(this);
	}
};

Abstract_declaratorContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitAbstract_declarator(this);
	}
};




ObjCParser.Abstract_declaratorContext = Abstract_declaratorContext;

ObjCParser.prototype.abstract_declarator = function() {

    var localctx = new Abstract_declaratorContext(this, this._ctx, this.state);
    this.enterRule(localctx, 176, ObjCParser.RULE_abstract_declarator);
    var _la = 0; // Token type
    try {
        this.state = 1021;
        var la_ = this._interp.adaptivePredict(this._input,113,this._ctx);
        switch(la_) {
        case 1:
            this.enterOuterAlt(localctx, 1);
            this.state = 1000;
            this.pointer();
            this.state = 1001;
            this.abstract_declarator();
            break;

        case 2:
            this.enterOuterAlt(localctx, 2);
            this.state = 1003;
            this.match(ObjCParser.LPAREN);
            this.state = 1004;
            this.abstract_declarator();
            this.state = 1005;
            this.match(ObjCParser.RPAREN);
            this.state = 1007; 
            this._errHandler.sync(this);
            var _alt = 1;
            do {
            	switch (_alt) {
            	case 1:
            		this.state = 1006;
            		this.abstract_declarator_suffix();
            		break;
            	default:
            		throw new antlr4.error.NoViableAltException(this);
            	}
            	this.state = 1009; 
            	this._errHandler.sync(this);
            	_alt = this._interp.adaptivePredict(this._input,110, this._ctx);
            } while ( _alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER );
            break;

        case 3:
            this.enterOuterAlt(localctx, 3);
            this.state = 1016; 
            this._errHandler.sync(this);
            _la = this._input.LA(1);
            do {
                this.state = 1011;
                this.match(ObjCParser.LBRACK);
                this.state = 1013;
                _la = this._input.LA(1);
                if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << ObjCParser.ENCODE) | (1 << ObjCParser.PROTOCOL) | (1 << ObjCParser.SELECTOR) | (1 << ObjCParser.SUPER) | (1 << ObjCParser.SELF))) !== 0) || ((((_la - 55)) & ~0x1f) == 0 && ((1 << (_la - 55)) & ((1 << (ObjCParser.SIZEOF - 55)) | (1 << (ObjCParser.LPAREN - 55)) | (1 << (ObjCParser.LBRACK - 55)) | (1 << (ObjCParser.AT - 55)) | (1 << (ObjCParser.BANG - 55)) | (1 << (ObjCParser.TILDE - 55)))) !== 0) || ((((_la - 93)) & ~0x1f) == 0 && ((1 << (_la - 93)) & ((1 << (ObjCParser.INC - 93)) | (1 << (ObjCParser.DEC - 93)) | (1 << (ObjCParser.SUB - 93)) | (1 << (ObjCParser.MUL - 93)) | (1 << (ObjCParser.BITAND - 93)) | (1 << (ObjCParser.CARET - 93)))) !== 0) || ((((_la - 125)) & ~0x1f) == 0 && ((1 << (_la - 125)) & ((1 << (ObjCParser.IDENTIFIER - 125)) | (1 << (ObjCParser.CHARACTER_LITERAL - 125)) | (1 << (ObjCParser.STRING_LITERAL - 125)) | (1 << (ObjCParser.HEX_LITERAL - 125)) | (1 << (ObjCParser.DECIMAL_LITERAL - 125)) | (1 << (ObjCParser.OCTAL_LITERAL - 125)) | (1 << (ObjCParser.FLOATING_POINT_LITERAL - 125)))) !== 0)) {
                    this.state = 1012;
                    this.constant_expression();
                }

                this.state = 1015;
                this.match(ObjCParser.RBRACK);
                this.state = 1018; 
                this._errHandler.sync(this);
                _la = this._input.LA(1);
            } while(_la===ObjCParser.LBRACK);
            break;

        case 4:
            this.enterOuterAlt(localctx, 4);

            break;

        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Abstract_declarator_suffixContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_abstract_declarator_suffix;
    return this;
}

Abstract_declarator_suffixContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Abstract_declarator_suffixContext.prototype.constructor = Abstract_declarator_suffixContext;

Abstract_declarator_suffixContext.prototype.constant_expression = function() {
    return this.getTypedRuleContext(Constant_expressionContext,0);
};

Abstract_declarator_suffixContext.prototype.parameter_declaration_list = function() {
    return this.getTypedRuleContext(Parameter_declaration_listContext,0);
};

Abstract_declarator_suffixContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterAbstract_declarator_suffix(this);
	}
};

Abstract_declarator_suffixContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitAbstract_declarator_suffix(this);
	}
};




ObjCParser.Abstract_declarator_suffixContext = Abstract_declarator_suffixContext;

ObjCParser.prototype.abstract_declarator_suffix = function() {

    var localctx = new Abstract_declarator_suffixContext(this, this._ctx, this.state);
    this.enterRule(localctx, 178, ObjCParser.RULE_abstract_declarator_suffix);
    var _la = 0; // Token type
    try {
        this.state = 1033;
        switch(this._input.LA(1)) {
        case ObjCParser.LBRACK:
            this.enterOuterAlt(localctx, 1);
            this.state = 1023;
            this.match(ObjCParser.LBRACK);
            this.state = 1025;
            _la = this._input.LA(1);
            if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << ObjCParser.ENCODE) | (1 << ObjCParser.PROTOCOL) | (1 << ObjCParser.SELECTOR) | (1 << ObjCParser.SUPER) | (1 << ObjCParser.SELF))) !== 0) || ((((_la - 55)) & ~0x1f) == 0 && ((1 << (_la - 55)) & ((1 << (ObjCParser.SIZEOF - 55)) | (1 << (ObjCParser.LPAREN - 55)) | (1 << (ObjCParser.LBRACK - 55)) | (1 << (ObjCParser.AT - 55)) | (1 << (ObjCParser.BANG - 55)) | (1 << (ObjCParser.TILDE - 55)))) !== 0) || ((((_la - 93)) & ~0x1f) == 0 && ((1 << (_la - 93)) & ((1 << (ObjCParser.INC - 93)) | (1 << (ObjCParser.DEC - 93)) | (1 << (ObjCParser.SUB - 93)) | (1 << (ObjCParser.MUL - 93)) | (1 << (ObjCParser.BITAND - 93)) | (1 << (ObjCParser.CARET - 93)))) !== 0) || ((((_la - 125)) & ~0x1f) == 0 && ((1 << (_la - 125)) & ((1 << (ObjCParser.IDENTIFIER - 125)) | (1 << (ObjCParser.CHARACTER_LITERAL - 125)) | (1 << (ObjCParser.STRING_LITERAL - 125)) | (1 << (ObjCParser.HEX_LITERAL - 125)) | (1 << (ObjCParser.DECIMAL_LITERAL - 125)) | (1 << (ObjCParser.OCTAL_LITERAL - 125)) | (1 << (ObjCParser.FLOATING_POINT_LITERAL - 125)))) !== 0)) {
                this.state = 1024;
                this.constant_expression();
            }

            this.state = 1027;
            this.match(ObjCParser.RBRACK);
            break;
        case ObjCParser.LPAREN:
            this.enterOuterAlt(localctx, 2);
            this.state = 1028;
            this.match(ObjCParser.LPAREN);
            this.state = 1030;
            _la = this._input.LA(1);
            if(((((_la - 25)) & ~0x1f) == 0 && ((1 << (_la - 25)) & ((1 << (ObjCParser.AUTO - 25)) | (1 << (ObjCParser.BYCOPY - 25)) | (1 << (ObjCParser.BYREF - 25)) | (1 << (ObjCParser.CHAR - 25)) | (1 << (ObjCParser.CONST - 25)) | (1 << (ObjCParser.DOUBLE - 25)) | (1 << (ObjCParser.ENUM - 25)) | (1 << (ObjCParser.EXTERN - 25)) | (1 << (ObjCParser.FLOAT - 25)) | (1 << (ObjCParser.ID - 25)) | (1 << (ObjCParser.IN - 25)) | (1 << (ObjCParser.INOUT - 25)) | (1 << (ObjCParser.INT - 25)) | (1 << (ObjCParser.LONG - 25)) | (1 << (ObjCParser.ONEWAY - 25)) | (1 << (ObjCParser.OUT - 25)) | (1 << (ObjCParser.REGISTER - 25)) | (1 << (ObjCParser.SHORT - 25)) | (1 << (ObjCParser.SIGNED - 25)) | (1 << (ObjCParser.STATIC - 25)))) !== 0) || ((((_la - 57)) & ~0x1f) == 0 && ((1 << (_la - 57)) & ((1 << (ObjCParser.STRUCT - 57)) | (1 << (ObjCParser.TYPEDEF - 57)) | (1 << (ObjCParser.UNION - 57)) | (1 << (ObjCParser.UNSIGNED - 57)) | (1 << (ObjCParser.VOID - 57)) | (1 << (ObjCParser.VOLATILE - 57)) | (1 << (ObjCParser.NS_OPTIONS - 57)) | (1 << (ObjCParser.NS_ENUM - 57)) | (1 << (ObjCParser.WWEAK - 57)) | (1 << (ObjCParser.WUNSAFE_UNRETAINED - 57)))) !== 0) || _la===ObjCParser.IDENTIFIER) {
                this.state = 1029;
                this.parameter_declaration_list();
            }

            this.state = 1032;
            this.match(ObjCParser.RPAREN);
            break;
        default:
            throw new antlr4.error.NoViableAltException(this);
        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Parameter_declaration_listContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_parameter_declaration_list;
    return this;
}

Parameter_declaration_listContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Parameter_declaration_listContext.prototype.constructor = Parameter_declaration_listContext;

Parameter_declaration_listContext.prototype.parameter_declaration = function(i) {
    if(i===undefined) {
        i = null;
    }
    if(i===null) {
        return this.getTypedRuleContexts(Parameter_declarationContext);
    } else {
        return this.getTypedRuleContext(Parameter_declarationContext,i);
    }
};

Parameter_declaration_listContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterParameter_declaration_list(this);
	}
};

Parameter_declaration_listContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitParameter_declaration_list(this);
	}
};




ObjCParser.Parameter_declaration_listContext = Parameter_declaration_listContext;

ObjCParser.prototype.parameter_declaration_list = function() {

    var localctx = new Parameter_declaration_listContext(this, this._ctx, this.state);
    this.enterRule(localctx, 180, ObjCParser.RULE_parameter_declaration_list);
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 1035;
        this.parameter_declaration();
        this.state = 1040;
        this._errHandler.sync(this);
        var _alt = this._interp.adaptivePredict(this._input,117,this._ctx)
        while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) {
            if(_alt===1) {
                this.state = 1036;
                this.match(ObjCParser.COMMA);
                this.state = 1037;
                this.parameter_declaration(); 
            }
            this.state = 1042;
            this._errHandler.sync(this);
            _alt = this._interp.adaptivePredict(this._input,117,this._ctx);
        }

    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Statement_listContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_statement_list;
    return this;
}

Statement_listContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Statement_listContext.prototype.constructor = Statement_listContext;

Statement_listContext.prototype.statement = function(i) {
    if(i===undefined) {
        i = null;
    }
    if(i===null) {
        return this.getTypedRuleContexts(StatementContext);
    } else {
        return this.getTypedRuleContext(StatementContext,i);
    }
};

Statement_listContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterStatement_list(this);
	}
};

Statement_listContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitStatement_list(this);
	}
};




ObjCParser.Statement_listContext = Statement_listContext;

ObjCParser.prototype.statement_list = function() {

    var localctx = new Statement_listContext(this, this._ctx, this.state);
    this.enterRule(localctx, 182, ObjCParser.RULE_statement_list);
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 1044; 
        this._errHandler.sync(this);
        var _alt = 1;
        do {
        	switch (_alt) {
        	case 1:
        		this.state = 1043;
        		this.statement();
        		break;
        	default:
        		throw new antlr4.error.NoViableAltException(this);
        	}
        	this.state = 1046; 
        	this._errHandler.sync(this);
        	_alt = this._interp.adaptivePredict(this._input,118, this._ctx);
        } while ( _alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER );
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function StatementContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_statement;
    return this;
}

StatementContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
StatementContext.prototype.constructor = StatementContext;

StatementContext.prototype.labeled_statement = function() {
    return this.getTypedRuleContext(Labeled_statementContext,0);
};

StatementContext.prototype.expression = function() {
    return this.getTypedRuleContext(ExpressionContext,0);
};

StatementContext.prototype.compound_statement = function() {
    return this.getTypedRuleContext(Compound_statementContext,0);
};

StatementContext.prototype.selection_statement = function() {
    return this.getTypedRuleContext(Selection_statementContext,0);
};

StatementContext.prototype.iteration_statement = function() {
    return this.getTypedRuleContext(Iteration_statementContext,0);
};

StatementContext.prototype.jump_statement = function() {
    return this.getTypedRuleContext(Jump_statementContext,0);
};

StatementContext.prototype.synchronized_statement = function() {
    return this.getTypedRuleContext(Synchronized_statementContext,0);
};

StatementContext.prototype.autorelease_statement = function() {
    return this.getTypedRuleContext(Autorelease_statementContext,0);
};

StatementContext.prototype.try_block = function() {
    return this.getTypedRuleContext(Try_blockContext,0);
};

StatementContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterStatement(this);
	}
};

StatementContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitStatement(this);
	}
};




ObjCParser.StatementContext = StatementContext;

ObjCParser.prototype.statement = function() {

    var localctx = new StatementContext(this, this._ctx, this.state);
    this.enterRule(localctx, 184, ObjCParser.RULE_statement);
    try {
        this.state = 1060;
        var la_ = this._interp.adaptivePredict(this._input,119,this._ctx);
        switch(la_) {
        case 1:
            this.enterOuterAlt(localctx, 1);
            this.state = 1048;
            this.labeled_statement();
            break;

        case 2:
            this.enterOuterAlt(localctx, 2);
            this.state = 1049;
            this.expression();
            this.state = 1050;
            this.match(ObjCParser.SEMI);
            break;

        case 3:
            this.enterOuterAlt(localctx, 3);
            this.state = 1052;
            this.compound_statement();
            break;

        case 4:
            this.enterOuterAlt(localctx, 4);
            this.state = 1053;
            this.selection_statement();
            break;

        case 5:
            this.enterOuterAlt(localctx, 5);
            this.state = 1054;
            this.iteration_statement();
            break;

        case 6:
            this.enterOuterAlt(localctx, 6);
            this.state = 1055;
            this.jump_statement();
            break;

        case 7:
            this.enterOuterAlt(localctx, 7);
            this.state = 1056;
            this.synchronized_statement();
            break;

        case 8:
            this.enterOuterAlt(localctx, 8);
            this.state = 1057;
            this.autorelease_statement();
            break;

        case 9:
            this.enterOuterAlt(localctx, 9);
            this.state = 1058;
            this.try_block();
            break;

        case 10:
            this.enterOuterAlt(localctx, 10);
            this.state = 1059;
            this.match(ObjCParser.SEMI);
            break;

        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Labeled_statementContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_labeled_statement;
    return this;
}

Labeled_statementContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Labeled_statementContext.prototype.constructor = Labeled_statementContext;

Labeled_statementContext.prototype.identifier = function() {
    return this.getTypedRuleContext(IdentifierContext,0);
};

Labeled_statementContext.prototype.statement = function() {
    return this.getTypedRuleContext(StatementContext,0);
};

Labeled_statementContext.prototype.constant_expression = function() {
    return this.getTypedRuleContext(Constant_expressionContext,0);
};

Labeled_statementContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterLabeled_statement(this);
	}
};

Labeled_statementContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitLabeled_statement(this);
	}
};




ObjCParser.Labeled_statementContext = Labeled_statementContext;

ObjCParser.prototype.labeled_statement = function() {

    var localctx = new Labeled_statementContext(this, this._ctx, this.state);
    this.enterRule(localctx, 186, ObjCParser.RULE_labeled_statement);
    try {
        this.state = 1074;
        switch(this._input.LA(1)) {
        case ObjCParser.IDENTIFIER:
            this.enterOuterAlt(localctx, 1);
            this.state = 1062;
            this.identifier();
            this.state = 1063;
            this.match(ObjCParser.COLON);
            this.state = 1064;
            this.statement();
            break;
        case ObjCParser.CASE:
            this.enterOuterAlt(localctx, 2);
            this.state = 1066;
            this.match(ObjCParser.CASE);
            this.state = 1067;
            this.constant_expression();
            this.state = 1068;
            this.match(ObjCParser.COLON);
            this.state = 1069;
            this.statement();
            break;
        case ObjCParser.DEFAULT:
            this.enterOuterAlt(localctx, 3);
            this.state = 1071;
            this.match(ObjCParser.DEFAULT);
            this.state = 1072;
            this.match(ObjCParser.COLON);
            this.state = 1073;
            this.statement();
            break;
        default:
            throw new antlr4.error.NoViableAltException(this);
        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Compound_statementContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_compound_statement;
    return this;
}

Compound_statementContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Compound_statementContext.prototype.constructor = Compound_statementContext;

Compound_statementContext.prototype.declaration = function(i) {
    if(i===undefined) {
        i = null;
    }
    if(i===null) {
        return this.getTypedRuleContexts(DeclarationContext);
    } else {
        return this.getTypedRuleContext(DeclarationContext,i);
    }
};

Compound_statementContext.prototype.statement_list = function(i) {
    if(i===undefined) {
        i = null;
    }
    if(i===null) {
        return this.getTypedRuleContexts(Statement_listContext);
    } else {
        return this.getTypedRuleContext(Statement_listContext,i);
    }
};

Compound_statementContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterCompound_statement(this);
	}
};

Compound_statementContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitCompound_statement(this);
	}
};




ObjCParser.Compound_statementContext = Compound_statementContext;

ObjCParser.prototype.compound_statement = function() {

    var localctx = new Compound_statementContext(this, this._ctx, this.state);
    this.enterRule(localctx, 188, ObjCParser.RULE_compound_statement);
    var _la = 0; // Token type
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 1076;
        this.match(ObjCParser.LBRACE);
        this.state = 1081;
        this._errHandler.sync(this);
        _la = this._input.LA(1);
        while((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << ObjCParser.AUTORELEASEPOOL) | (1 << ObjCParser.ENCODE) | (1 << ObjCParser.PROTOCOL) | (1 << ObjCParser.SELECTOR) | (1 << ObjCParser.SYNCHRONIZED) | (1 << ObjCParser.TRY) | (1 << ObjCParser.SUPER) | (1 << ObjCParser.SELF) | (1 << ObjCParser.AUTO) | (1 << ObjCParser.BREAK) | (1 << ObjCParser.BYCOPY) | (1 << ObjCParser.BYREF) | (1 << ObjCParser.CASE) | (1 << ObjCParser.CHAR))) !== 0) || ((((_la - 32)) & ~0x1f) == 0 && ((1 << (_la - 32)) & ((1 << (ObjCParser.CONST - 32)) | (1 << (ObjCParser.CONTINUE - 32)) | (1 << (ObjCParser.DEFAULT - 32)) | (1 << (ObjCParser.DO - 32)) | (1 << (ObjCParser.DOUBLE - 32)) | (1 << (ObjCParser.ENUM - 32)) | (1 << (ObjCParser.EXTERN - 32)) | (1 << (ObjCParser.FLOAT - 32)) | (1 << (ObjCParser.FOR - 32)) | (1 << (ObjCParser.ID - 32)) | (1 << (ObjCParser.IF - 32)) | (1 << (ObjCParser.IN - 32)) | (1 << (ObjCParser.INOUT - 32)) | (1 << (ObjCParser.GOTO - 32)) | (1 << (ObjCParser.INT - 32)) | (1 << (ObjCParser.LONG - 32)) | (1 << (ObjCParser.ONEWAY - 32)) | (1 << (ObjCParser.OUT - 32)) | (1 << (ObjCParser.REGISTER - 32)) | (1 << (ObjCParser.RETURN - 32)) | (1 << (ObjCParser.SHORT - 32)) | (1 << (ObjCParser.SIGNED - 32)) | (1 << (ObjCParser.SIZEOF - 32)) | (1 << (ObjCParser.STATIC - 32)) | (1 << (ObjCParser.STRUCT - 32)) | (1 << (ObjCParser.SWITCH - 32)) | (1 << (ObjCParser.TYPEDEF - 32)) | (1 << (ObjCParser.UNION - 32)) | (1 << (ObjCParser.UNSIGNED - 32)) | (1 << (ObjCParser.VOID - 32)) | (1 << (ObjCParser.VOLATILE - 32)))) !== 0) || ((((_la - 64)) & ~0x1f) == 0 && ((1 << (_la - 64)) & ((1 << (ObjCParser.WHILE - 64)) | (1 << (ObjCParser.NS_OPTIONS - 64)) | (1 << (ObjCParser.NS_ENUM - 64)) | (1 << (ObjCParser.WWEAK - 64)) | (1 << (ObjCParser.WUNSAFE_UNRETAINED - 64)) | (1 << (ObjCParser.LPAREN - 64)) | (1 << (ObjCParser.LBRACE - 64)) | (1 << (ObjCParser.LBRACK - 64)) | (1 << (ObjCParser.SEMI - 64)) | (1 << (ObjCParser.AT - 64)) | (1 << (ObjCParser.BANG - 64)) | (1 << (ObjCParser.TILDE - 64)) | (1 << (ObjCParser.INC - 64)) | (1 << (ObjCParser.DEC - 64)))) !== 0) || ((((_la - 96)) & ~0x1f) == 0 && ((1 << (_la - 96)) & ((1 << (ObjCParser.SUB - 96)) | (1 << (ObjCParser.MUL - 96)) | (1 << (ObjCParser.BITAND - 96)) | (1 << (ObjCParser.CARET - 96)) | (1 << (ObjCParser.IDENTIFIER - 96)) | (1 << (ObjCParser.CHARACTER_LITERAL - 96)) | (1 << (ObjCParser.STRING_LITERAL - 96)))) !== 0) || ((((_la - 128)) & ~0x1f) == 0 && ((1 << (_la - 128)) & ((1 << (ObjCParser.HEX_LITERAL - 128)) | (1 << (ObjCParser.DECIMAL_LITERAL - 128)) | (1 << (ObjCParser.OCTAL_LITERAL - 128)) | (1 << (ObjCParser.FLOATING_POINT_LITERAL - 128)))) !== 0)) {
            this.state = 1079;
            var la_ = this._interp.adaptivePredict(this._input,121,this._ctx);
            switch(la_) {
            case 1:
                this.state = 1077;
                this.declaration();
                break;

            case 2:
                this.state = 1078;
                this.statement_list();
                break;

            }
            this.state = 1083;
            this._errHandler.sync(this);
            _la = this._input.LA(1);
        }
        this.state = 1084;
        this.match(ObjCParser.RBRACE);
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Selection_statementContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_selection_statement;
    return this;
}

Selection_statementContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Selection_statementContext.prototype.constructor = Selection_statementContext;

Selection_statementContext.prototype.expression = function() {
    return this.getTypedRuleContext(ExpressionContext,0);
};

Selection_statementContext.prototype.statement = function(i) {
    if(i===undefined) {
        i = null;
    }
    if(i===null) {
        return this.getTypedRuleContexts(StatementContext);
    } else {
        return this.getTypedRuleContext(StatementContext,i);
    }
};

Selection_statementContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterSelection_statement(this);
	}
};

Selection_statementContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitSelection_statement(this);
	}
};




ObjCParser.Selection_statementContext = Selection_statementContext;

ObjCParser.prototype.selection_statement = function() {

    var localctx = new Selection_statementContext(this, this._ctx, this.state);
    this.enterRule(localctx, 190, ObjCParser.RULE_selection_statement);
    try {
        this.state = 1101;
        switch(this._input.LA(1)) {
        case ObjCParser.IF:
            this.enterOuterAlt(localctx, 1);
            this.state = 1086;
            this.match(ObjCParser.IF);
            this.state = 1087;
            this.match(ObjCParser.LPAREN);
            this.state = 1088;
            this.expression();
            this.state = 1089;
            this.match(ObjCParser.RPAREN);
            this.state = 1090;
            this.statement();
            this.state = 1093;
            var la_ = this._interp.adaptivePredict(this._input,123,this._ctx);
            if(la_===1) {
                this.state = 1091;
                this.match(ObjCParser.ELSE);
                this.state = 1092;
                this.statement();

            }
            break;
        case ObjCParser.SWITCH:
            this.enterOuterAlt(localctx, 2);
            this.state = 1095;
            this.match(ObjCParser.SWITCH);
            this.state = 1096;
            this.match(ObjCParser.LPAREN);
            this.state = 1097;
            this.expression();
            this.state = 1098;
            this.match(ObjCParser.RPAREN);
            this.state = 1099;
            this.statement();
            break;
        default:
            throw new antlr4.error.NoViableAltException(this);
        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function For_in_statementContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_for_in_statement;
    return this;
}

For_in_statementContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
For_in_statementContext.prototype.constructor = For_in_statementContext;

For_in_statementContext.prototype.type_variable_declarator = function() {
    return this.getTypedRuleContext(Type_variable_declaratorContext,0);
};

For_in_statementContext.prototype.statement = function() {
    return this.getTypedRuleContext(StatementContext,0);
};

For_in_statementContext.prototype.expression = function() {
    return this.getTypedRuleContext(ExpressionContext,0);
};

For_in_statementContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterFor_in_statement(this);
	}
};

For_in_statementContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitFor_in_statement(this);
	}
};




ObjCParser.For_in_statementContext = For_in_statementContext;

ObjCParser.prototype.for_in_statement = function() {

    var localctx = new For_in_statementContext(this, this._ctx, this.state);
    this.enterRule(localctx, 192, ObjCParser.RULE_for_in_statement);
    var _la = 0; // Token type
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 1103;
        this.match(ObjCParser.FOR);
        this.state = 1104;
        this.match(ObjCParser.LPAREN);
        this.state = 1105;
        this.type_variable_declarator();
        this.state = 1106;
        this.match(ObjCParser.IN);
        this.state = 1108;
        _la = this._input.LA(1);
        if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << ObjCParser.ENCODE) | (1 << ObjCParser.PROTOCOL) | (1 << ObjCParser.SELECTOR) | (1 << ObjCParser.SUPER) | (1 << ObjCParser.SELF))) !== 0) || ((((_la - 55)) & ~0x1f) == 0 && ((1 << (_la - 55)) & ((1 << (ObjCParser.SIZEOF - 55)) | (1 << (ObjCParser.LPAREN - 55)) | (1 << (ObjCParser.LBRACK - 55)) | (1 << (ObjCParser.AT - 55)) | (1 << (ObjCParser.BANG - 55)) | (1 << (ObjCParser.TILDE - 55)))) !== 0) || ((((_la - 93)) & ~0x1f) == 0 && ((1 << (_la - 93)) & ((1 << (ObjCParser.INC - 93)) | (1 << (ObjCParser.DEC - 93)) | (1 << (ObjCParser.SUB - 93)) | (1 << (ObjCParser.MUL - 93)) | (1 << (ObjCParser.BITAND - 93)) | (1 << (ObjCParser.CARET - 93)))) !== 0) || ((((_la - 125)) & ~0x1f) == 0 && ((1 << (_la - 125)) & ((1 << (ObjCParser.IDENTIFIER - 125)) | (1 << (ObjCParser.CHARACTER_LITERAL - 125)) | (1 << (ObjCParser.STRING_LITERAL - 125)) | (1 << (ObjCParser.HEX_LITERAL - 125)) | (1 << (ObjCParser.DECIMAL_LITERAL - 125)) | (1 << (ObjCParser.OCTAL_LITERAL - 125)) | (1 << (ObjCParser.FLOATING_POINT_LITERAL - 125)))) !== 0)) {
            this.state = 1107;
            this.expression();
        }

        this.state = 1110;
        this.match(ObjCParser.RPAREN);
        this.state = 1111;
        this.statement();
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function For_statementContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_for_statement;
    return this;
}

For_statementContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
For_statementContext.prototype.constructor = For_statementContext;

For_statementContext.prototype.statement = function() {
    return this.getTypedRuleContext(StatementContext,0);
};

For_statementContext.prototype.expression = function(i) {
    if(i===undefined) {
        i = null;
    }
    if(i===null) {
        return this.getTypedRuleContexts(ExpressionContext);
    } else {
        return this.getTypedRuleContext(ExpressionContext,i);
    }
};

For_statementContext.prototype.declaration_specifiers = function() {
    return this.getTypedRuleContext(Declaration_specifiersContext,0);
};

For_statementContext.prototype.init_declarator_list = function() {
    return this.getTypedRuleContext(Init_declarator_listContext,0);
};

For_statementContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterFor_statement(this);
	}
};

For_statementContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitFor_statement(this);
	}
};




ObjCParser.For_statementContext = For_statementContext;

ObjCParser.prototype.for_statement = function() {

    var localctx = new For_statementContext(this, this._ctx, this.state);
    this.enterRule(localctx, 194, ObjCParser.RULE_for_statement);
    var _la = 0; // Token type
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 1113;
        this.match(ObjCParser.FOR);
        this.state = 1114;
        this.match(ObjCParser.LPAREN);
        this.state = 1119;
        var la_ = this._interp.adaptivePredict(this._input,126,this._ctx);
        if(la_===1) {
            this.state = 1115;
            this.declaration_specifiers();
            this.state = 1116;
            this.init_declarator_list();

        } else if(la_===2) {
            this.state = 1118;
            this.expression();

        }
        this.state = 1121;
        this.match(ObjCParser.SEMI);
        this.state = 1123;
        _la = this._input.LA(1);
        if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << ObjCParser.ENCODE) | (1 << ObjCParser.PROTOCOL) | (1 << ObjCParser.SELECTOR) | (1 << ObjCParser.SUPER) | (1 << ObjCParser.SELF))) !== 0) || ((((_la - 55)) & ~0x1f) == 0 && ((1 << (_la - 55)) & ((1 << (ObjCParser.SIZEOF - 55)) | (1 << (ObjCParser.LPAREN - 55)) | (1 << (ObjCParser.LBRACK - 55)) | (1 << (ObjCParser.AT - 55)) | (1 << (ObjCParser.BANG - 55)) | (1 << (ObjCParser.TILDE - 55)))) !== 0) || ((((_la - 93)) & ~0x1f) == 0 && ((1 << (_la - 93)) & ((1 << (ObjCParser.INC - 93)) | (1 << (ObjCParser.DEC - 93)) | (1 << (ObjCParser.SUB - 93)) | (1 << (ObjCParser.MUL - 93)) | (1 << (ObjCParser.BITAND - 93)) | (1 << (ObjCParser.CARET - 93)))) !== 0) || ((((_la - 125)) & ~0x1f) == 0 && ((1 << (_la - 125)) & ((1 << (ObjCParser.IDENTIFIER - 125)) | (1 << (ObjCParser.CHARACTER_LITERAL - 125)) | (1 << (ObjCParser.STRING_LITERAL - 125)) | (1 << (ObjCParser.HEX_LITERAL - 125)) | (1 << (ObjCParser.DECIMAL_LITERAL - 125)) | (1 << (ObjCParser.OCTAL_LITERAL - 125)) | (1 << (ObjCParser.FLOATING_POINT_LITERAL - 125)))) !== 0)) {
            this.state = 1122;
            this.expression();
        }

        this.state = 1125;
        this.match(ObjCParser.SEMI);
        this.state = 1127;
        _la = this._input.LA(1);
        if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << ObjCParser.ENCODE) | (1 << ObjCParser.PROTOCOL) | (1 << ObjCParser.SELECTOR) | (1 << ObjCParser.SUPER) | (1 << ObjCParser.SELF))) !== 0) || ((((_la - 55)) & ~0x1f) == 0 && ((1 << (_la - 55)) & ((1 << (ObjCParser.SIZEOF - 55)) | (1 << (ObjCParser.LPAREN - 55)) | (1 << (ObjCParser.LBRACK - 55)) | (1 << (ObjCParser.AT - 55)) | (1 << (ObjCParser.BANG - 55)) | (1 << (ObjCParser.TILDE - 55)))) !== 0) || ((((_la - 93)) & ~0x1f) == 0 && ((1 << (_la - 93)) & ((1 << (ObjCParser.INC - 93)) | (1 << (ObjCParser.DEC - 93)) | (1 << (ObjCParser.SUB - 93)) | (1 << (ObjCParser.MUL - 93)) | (1 << (ObjCParser.BITAND - 93)) | (1 << (ObjCParser.CARET - 93)))) !== 0) || ((((_la - 125)) & ~0x1f) == 0 && ((1 << (_la - 125)) & ((1 << (ObjCParser.IDENTIFIER - 125)) | (1 << (ObjCParser.CHARACTER_LITERAL - 125)) | (1 << (ObjCParser.STRING_LITERAL - 125)) | (1 << (ObjCParser.HEX_LITERAL - 125)) | (1 << (ObjCParser.DECIMAL_LITERAL - 125)) | (1 << (ObjCParser.OCTAL_LITERAL - 125)) | (1 << (ObjCParser.FLOATING_POINT_LITERAL - 125)))) !== 0)) {
            this.state = 1126;
            this.expression();
        }

        this.state = 1129;
        this.match(ObjCParser.RPAREN);
        this.state = 1130;
        this.statement();
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function While_statementContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_while_statement;
    return this;
}

While_statementContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
While_statementContext.prototype.constructor = While_statementContext;

While_statementContext.prototype.expression = function() {
    return this.getTypedRuleContext(ExpressionContext,0);
};

While_statementContext.prototype.statement = function() {
    return this.getTypedRuleContext(StatementContext,0);
};

While_statementContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterWhile_statement(this);
	}
};

While_statementContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitWhile_statement(this);
	}
};




ObjCParser.While_statementContext = While_statementContext;

ObjCParser.prototype.while_statement = function() {

    var localctx = new While_statementContext(this, this._ctx, this.state);
    this.enterRule(localctx, 196, ObjCParser.RULE_while_statement);
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 1132;
        this.match(ObjCParser.WHILE);
        this.state = 1133;
        this.match(ObjCParser.LPAREN);
        this.state = 1134;
        this.expression();
        this.state = 1135;
        this.match(ObjCParser.RPAREN);
        this.state = 1136;
        this.statement();
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Do_statementContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_do_statement;
    return this;
}

Do_statementContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Do_statementContext.prototype.constructor = Do_statementContext;

Do_statementContext.prototype.statement = function() {
    return this.getTypedRuleContext(StatementContext,0);
};

Do_statementContext.prototype.expression = function() {
    return this.getTypedRuleContext(ExpressionContext,0);
};

Do_statementContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterDo_statement(this);
	}
};

Do_statementContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitDo_statement(this);
	}
};




ObjCParser.Do_statementContext = Do_statementContext;

ObjCParser.prototype.do_statement = function() {

    var localctx = new Do_statementContext(this, this._ctx, this.state);
    this.enterRule(localctx, 198, ObjCParser.RULE_do_statement);
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 1138;
        this.match(ObjCParser.DO);
        this.state = 1139;
        this.statement();
        this.state = 1140;
        this.match(ObjCParser.WHILE);
        this.state = 1141;
        this.match(ObjCParser.LPAREN);
        this.state = 1142;
        this.expression();
        this.state = 1143;
        this.match(ObjCParser.RPAREN);
        this.state = 1144;
        this.match(ObjCParser.SEMI);
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Iteration_statementContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_iteration_statement;
    return this;
}

Iteration_statementContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Iteration_statementContext.prototype.constructor = Iteration_statementContext;

Iteration_statementContext.prototype.while_statement = function() {
    return this.getTypedRuleContext(While_statementContext,0);
};

Iteration_statementContext.prototype.do_statement = function() {
    return this.getTypedRuleContext(Do_statementContext,0);
};

Iteration_statementContext.prototype.for_statement = function() {
    return this.getTypedRuleContext(For_statementContext,0);
};

Iteration_statementContext.prototype.for_in_statement = function() {
    return this.getTypedRuleContext(For_in_statementContext,0);
};

Iteration_statementContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterIteration_statement(this);
	}
};

Iteration_statementContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitIteration_statement(this);
	}
};




ObjCParser.Iteration_statementContext = Iteration_statementContext;

ObjCParser.prototype.iteration_statement = function() {

    var localctx = new Iteration_statementContext(this, this._ctx, this.state);
    this.enterRule(localctx, 200, ObjCParser.RULE_iteration_statement);
    try {
        this.state = 1150;
        var la_ = this._interp.adaptivePredict(this._input,129,this._ctx);
        switch(la_) {
        case 1:
            this.enterOuterAlt(localctx, 1);
            this.state = 1146;
            this.while_statement();
            break;

        case 2:
            this.enterOuterAlt(localctx, 2);
            this.state = 1147;
            this.do_statement();
            break;

        case 3:
            this.enterOuterAlt(localctx, 3);
            this.state = 1148;
            this.for_statement();
            break;

        case 4:
            this.enterOuterAlt(localctx, 4);
            this.state = 1149;
            this.for_in_statement();
            break;

        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Jump_statementContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_jump_statement;
    return this;
}

Jump_statementContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Jump_statementContext.prototype.constructor = Jump_statementContext;

Jump_statementContext.prototype.identifier = function() {
    return this.getTypedRuleContext(IdentifierContext,0);
};

Jump_statementContext.prototype.expression = function() {
    return this.getTypedRuleContext(ExpressionContext,0);
};

Jump_statementContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterJump_statement(this);
	}
};

Jump_statementContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitJump_statement(this);
	}
};




ObjCParser.Jump_statementContext = Jump_statementContext;

ObjCParser.prototype.jump_statement = function() {

    var localctx = new Jump_statementContext(this, this._ctx, this.state);
    this.enterRule(localctx, 202, ObjCParser.RULE_jump_statement);
    var _la = 0; // Token type
    try {
        this.state = 1165;
        switch(this._input.LA(1)) {
        case ObjCParser.GOTO:
            this.enterOuterAlt(localctx, 1);
            this.state = 1152;
            this.match(ObjCParser.GOTO);
            this.state = 1153;
            this.identifier();
            this.state = 1154;
            this.match(ObjCParser.SEMI);
            break;
        case ObjCParser.CONTINUE:
            this.enterOuterAlt(localctx, 2);
            this.state = 1156;
            this.match(ObjCParser.CONTINUE);
            this.state = 1157;
            this.match(ObjCParser.SEMI);
            break;
        case ObjCParser.BREAK:
            this.enterOuterAlt(localctx, 3);
            this.state = 1158;
            this.match(ObjCParser.BREAK);
            this.state = 1159;
            this.match(ObjCParser.SEMI);
            break;
        case ObjCParser.RETURN:
            this.enterOuterAlt(localctx, 4);
            this.state = 1160;
            this.match(ObjCParser.RETURN);
            this.state = 1162;
            _la = this._input.LA(1);
            if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << ObjCParser.ENCODE) | (1 << ObjCParser.PROTOCOL) | (1 << ObjCParser.SELECTOR) | (1 << ObjCParser.SUPER) | (1 << ObjCParser.SELF))) !== 0) || ((((_la - 55)) & ~0x1f) == 0 && ((1 << (_la - 55)) & ((1 << (ObjCParser.SIZEOF - 55)) | (1 << (ObjCParser.LPAREN - 55)) | (1 << (ObjCParser.LBRACK - 55)) | (1 << (ObjCParser.AT - 55)) | (1 << (ObjCParser.BANG - 55)) | (1 << (ObjCParser.TILDE - 55)))) !== 0) || ((((_la - 93)) & ~0x1f) == 0 && ((1 << (_la - 93)) & ((1 << (ObjCParser.INC - 93)) | (1 << (ObjCParser.DEC - 93)) | (1 << (ObjCParser.SUB - 93)) | (1 << (ObjCParser.MUL - 93)) | (1 << (ObjCParser.BITAND - 93)) | (1 << (ObjCParser.CARET - 93)))) !== 0) || ((((_la - 125)) & ~0x1f) == 0 && ((1 << (_la - 125)) & ((1 << (ObjCParser.IDENTIFIER - 125)) | (1 << (ObjCParser.CHARACTER_LITERAL - 125)) | (1 << (ObjCParser.STRING_LITERAL - 125)) | (1 << (ObjCParser.HEX_LITERAL - 125)) | (1 << (ObjCParser.DECIMAL_LITERAL - 125)) | (1 << (ObjCParser.OCTAL_LITERAL - 125)) | (1 << (ObjCParser.FLOATING_POINT_LITERAL - 125)))) !== 0)) {
                this.state = 1161;
                this.expression();
            }

            this.state = 1164;
            this.match(ObjCParser.SEMI);
            break;
        default:
            throw new antlr4.error.NoViableAltException(this);
        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function ExpressionContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_expression;
    return this;
}

ExpressionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
ExpressionContext.prototype.constructor = ExpressionContext;

ExpressionContext.prototype.assignment_expression = function(i) {
    if(i===undefined) {
        i = null;
    }
    if(i===null) {
        return this.getTypedRuleContexts(Assignment_expressionContext);
    } else {
        return this.getTypedRuleContext(Assignment_expressionContext,i);
    }
};

ExpressionContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterExpression(this);
	}
};

ExpressionContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitExpression(this);
	}
};




ObjCParser.ExpressionContext = ExpressionContext;

ObjCParser.prototype.expression = function() {

    var localctx = new ExpressionContext(this, this._ctx, this.state);
    this.enterRule(localctx, 204, ObjCParser.RULE_expression);
    var _la = 0; // Token type
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 1167;
        this.assignment_expression();
        this.state = 1172;
        this._errHandler.sync(this);
        _la = this._input.LA(1);
        while(_la===ObjCParser.COMMA) {
            this.state = 1168;
            this.match(ObjCParser.COMMA);
            this.state = 1169;
            this.assignment_expression();
            this.state = 1174;
            this._errHandler.sync(this);
            _la = this._input.LA(1);
        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Assignment_expressionContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_assignment_expression;
    return this;
}

Assignment_expressionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Assignment_expressionContext.prototype.constructor = Assignment_expressionContext;

Assignment_expressionContext.prototype.conditional_expression = function() {
    return this.getTypedRuleContext(Conditional_expressionContext,0);
};

Assignment_expressionContext.prototype.unary_expression = function() {
    return this.getTypedRuleContext(Unary_expressionContext,0);
};

Assignment_expressionContext.prototype.assignment_operator = function() {
    return this.getTypedRuleContext(Assignment_operatorContext,0);
};

Assignment_expressionContext.prototype.assignment_expression = function() {
    return this.getTypedRuleContext(Assignment_expressionContext,0);
};

Assignment_expressionContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterAssignment_expression(this);
	}
};

Assignment_expressionContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitAssignment_expression(this);
	}
};




ObjCParser.Assignment_expressionContext = Assignment_expressionContext;

ObjCParser.prototype.assignment_expression = function() {

    var localctx = new Assignment_expressionContext(this, this._ctx, this.state);
    this.enterRule(localctx, 206, ObjCParser.RULE_assignment_expression);
    try {
        this.state = 1180;
        var la_ = this._interp.adaptivePredict(this._input,133,this._ctx);
        switch(la_) {
        case 1:
            this.enterOuterAlt(localctx, 1);
            this.state = 1175;
            this.conditional_expression();
            break;

        case 2:
            this.enterOuterAlt(localctx, 2);
            this.state = 1176;
            this.unary_expression();
            this.state = 1177;
            this.assignment_operator();
            this.state = 1178;
            this.assignment_expression();
            break;

        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Assignment_operatorContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_assignment_operator;
    return this;
}

Assignment_operatorContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Assignment_operatorContext.prototype.constructor = Assignment_operatorContext;


Assignment_operatorContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterAssignment_operator(this);
	}
};

Assignment_operatorContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitAssignment_operator(this);
	}
};




ObjCParser.Assignment_operatorContext = Assignment_operatorContext;

ObjCParser.prototype.assignment_operator = function() {

    var localctx = new Assignment_operatorContext(this, this._ctx, this.state);
    this.enterRule(localctx, 208, ObjCParser.RULE_assignment_operator);
    var _la = 0; // Token type
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 1182;
        _la = this._input.LA(1);
        if(!(((((_la - 80)) & ~0x1f) == 0 && ((1 << (_la - 80)) & ((1 << (ObjCParser.ASSIGN - 80)) | (1 << (ObjCParser.ADD_ASSIGN - 80)) | (1 << (ObjCParser.SUB_ASSIGN - 80)) | (1 << (ObjCParser.MUL_ASSIGN - 80)) | (1 << (ObjCParser.DIV_ASSIGN - 80)) | (1 << (ObjCParser.AND_ASSIGN - 80)) | (1 << (ObjCParser.OR_ASSIGN - 80)) | (1 << (ObjCParser.XOR_ASSIGN - 80)))) !== 0) || ((((_la - 112)) & ~0x1f) == 0 && ((1 << (_la - 112)) & ((1 << (ObjCParser.MOD_ASSIGN - 112)) | (1 << (ObjCParser.LSHIFT_ASSIGN - 112)) | (1 << (ObjCParser.RSHIFT_ASSIGN - 112)))) !== 0))) {
        this._errHandler.recoverInline(this);
        }
        else {
            this.consume();
        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Conditional_expressionContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_conditional_expression;
    return this;
}

Conditional_expressionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Conditional_expressionContext.prototype.constructor = Conditional_expressionContext;

Conditional_expressionContext.prototype.logical_or_expression = function() {
    return this.getTypedRuleContext(Logical_or_expressionContext,0);
};

Conditional_expressionContext.prototype.conditional_expression = function(i) {
    if(i===undefined) {
        i = null;
    }
    if(i===null) {
        return this.getTypedRuleContexts(Conditional_expressionContext);
    } else {
        return this.getTypedRuleContext(Conditional_expressionContext,i);
    }
};

Conditional_expressionContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterConditional_expression(this);
	}
};

Conditional_expressionContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitConditional_expression(this);
	}
};




ObjCParser.Conditional_expressionContext = Conditional_expressionContext;

ObjCParser.prototype.conditional_expression = function() {

    var localctx = new Conditional_expressionContext(this, this._ctx, this.state);
    this.enterRule(localctx, 210, ObjCParser.RULE_conditional_expression);
    var _la = 0; // Token type
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 1184;
        this.logical_or_expression();
        this.state = 1190;
        _la = this._input.LA(1);
        if(_la===ObjCParser.QUESTION) {
            this.state = 1185;
            this.match(ObjCParser.QUESTION);
            this.state = 1186;
            this.conditional_expression();
            this.state = 1187;
            this.match(ObjCParser.COLON);
            this.state = 1188;
            this.conditional_expression();
        }

    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Constant_expressionContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_constant_expression;
    return this;
}

Constant_expressionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Constant_expressionContext.prototype.constructor = Constant_expressionContext;

Constant_expressionContext.prototype.conditional_expression = function() {
    return this.getTypedRuleContext(Conditional_expressionContext,0);
};

Constant_expressionContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterConstant_expression(this);
	}
};

Constant_expressionContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitConstant_expression(this);
	}
};




ObjCParser.Constant_expressionContext = Constant_expressionContext;

ObjCParser.prototype.constant_expression = function() {

    var localctx = new Constant_expressionContext(this, this._ctx, this.state);
    this.enterRule(localctx, 212, ObjCParser.RULE_constant_expression);
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 1192;
        this.conditional_expression();
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Logical_or_expressionContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_logical_or_expression;
    return this;
}

Logical_or_expressionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Logical_or_expressionContext.prototype.constructor = Logical_or_expressionContext;

Logical_or_expressionContext.prototype.logical_and_expression = function(i) {
    if(i===undefined) {
        i = null;
    }
    if(i===null) {
        return this.getTypedRuleContexts(Logical_and_expressionContext);
    } else {
        return this.getTypedRuleContext(Logical_and_expressionContext,i);
    }
};

Logical_or_expressionContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterLogical_or_expression(this);
	}
};

Logical_or_expressionContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitLogical_or_expression(this);
	}
};




ObjCParser.Logical_or_expressionContext = Logical_or_expressionContext;

ObjCParser.prototype.logical_or_expression = function() {

    var localctx = new Logical_or_expressionContext(this, this._ctx, this.state);
    this.enterRule(localctx, 214, ObjCParser.RULE_logical_or_expression);
    var _la = 0; // Token type
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 1194;
        this.logical_and_expression();
        this.state = 1199;
        this._errHandler.sync(this);
        _la = this._input.LA(1);
        while(_la===ObjCParser.OR) {
            this.state = 1195;
            this.match(ObjCParser.OR);
            this.state = 1196;
            this.logical_and_expression();
            this.state = 1201;
            this._errHandler.sync(this);
            _la = this._input.LA(1);
        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Logical_and_expressionContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_logical_and_expression;
    return this;
}

Logical_and_expressionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Logical_and_expressionContext.prototype.constructor = Logical_and_expressionContext;

Logical_and_expressionContext.prototype.inclusive_or_expression = function(i) {
    if(i===undefined) {
        i = null;
    }
    if(i===null) {
        return this.getTypedRuleContexts(Inclusive_or_expressionContext);
    } else {
        return this.getTypedRuleContext(Inclusive_or_expressionContext,i);
    }
};

Logical_and_expressionContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterLogical_and_expression(this);
	}
};

Logical_and_expressionContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitLogical_and_expression(this);
	}
};




ObjCParser.Logical_and_expressionContext = Logical_and_expressionContext;

ObjCParser.prototype.logical_and_expression = function() {

    var localctx = new Logical_and_expressionContext(this, this._ctx, this.state);
    this.enterRule(localctx, 216, ObjCParser.RULE_logical_and_expression);
    var _la = 0; // Token type
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 1202;
        this.inclusive_or_expression();
        this.state = 1207;
        this._errHandler.sync(this);
        _la = this._input.LA(1);
        while(_la===ObjCParser.AND) {
            this.state = 1203;
            this.match(ObjCParser.AND);
            this.state = 1204;
            this.inclusive_or_expression();
            this.state = 1209;
            this._errHandler.sync(this);
            _la = this._input.LA(1);
        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Inclusive_or_expressionContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_inclusive_or_expression;
    return this;
}

Inclusive_or_expressionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Inclusive_or_expressionContext.prototype.constructor = Inclusive_or_expressionContext;

Inclusive_or_expressionContext.prototype.exclusive_or_expression = function(i) {
    if(i===undefined) {
        i = null;
    }
    if(i===null) {
        return this.getTypedRuleContexts(Exclusive_or_expressionContext);
    } else {
        return this.getTypedRuleContext(Exclusive_or_expressionContext,i);
    }
};

Inclusive_or_expressionContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterInclusive_or_expression(this);
	}
};

Inclusive_or_expressionContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitInclusive_or_expression(this);
	}
};




ObjCParser.Inclusive_or_expressionContext = Inclusive_or_expressionContext;

ObjCParser.prototype.inclusive_or_expression = function() {

    var localctx = new Inclusive_or_expressionContext(this, this._ctx, this.state);
    this.enterRule(localctx, 218, ObjCParser.RULE_inclusive_or_expression);
    var _la = 0; // Token type
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 1210;
        this.exclusive_or_expression();
        this.state = 1215;
        this._errHandler.sync(this);
        _la = this._input.LA(1);
        while(_la===ObjCParser.BITOR) {
            this.state = 1211;
            this.match(ObjCParser.BITOR);
            this.state = 1212;
            this.exclusive_or_expression();
            this.state = 1217;
            this._errHandler.sync(this);
            _la = this._input.LA(1);
        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Exclusive_or_expressionContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_exclusive_or_expression;
    return this;
}

Exclusive_or_expressionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Exclusive_or_expressionContext.prototype.constructor = Exclusive_or_expressionContext;

Exclusive_or_expressionContext.prototype.and_expression = function(i) {
    if(i===undefined) {
        i = null;
    }
    if(i===null) {
        return this.getTypedRuleContexts(And_expressionContext);
    } else {
        return this.getTypedRuleContext(And_expressionContext,i);
    }
};

Exclusive_or_expressionContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterExclusive_or_expression(this);
	}
};

Exclusive_or_expressionContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitExclusive_or_expression(this);
	}
};




ObjCParser.Exclusive_or_expressionContext = Exclusive_or_expressionContext;

ObjCParser.prototype.exclusive_or_expression = function() {

    var localctx = new Exclusive_or_expressionContext(this, this._ctx, this.state);
    this.enterRule(localctx, 220, ObjCParser.RULE_exclusive_or_expression);
    var _la = 0; // Token type
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 1218;
        this.and_expression();
        this.state = 1223;
        this._errHandler.sync(this);
        _la = this._input.LA(1);
        while(_la===ObjCParser.CARET) {
            this.state = 1219;
            this.match(ObjCParser.CARET);
            this.state = 1220;
            this.and_expression();
            this.state = 1225;
            this._errHandler.sync(this);
            _la = this._input.LA(1);
        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function And_expressionContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_and_expression;
    return this;
}

And_expressionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
And_expressionContext.prototype.constructor = And_expressionContext;

And_expressionContext.prototype.equality_expression = function(i) {
    if(i===undefined) {
        i = null;
    }
    if(i===null) {
        return this.getTypedRuleContexts(Equality_expressionContext);
    } else {
        return this.getTypedRuleContext(Equality_expressionContext,i);
    }
};

And_expressionContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterAnd_expression(this);
	}
};

And_expressionContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitAnd_expression(this);
	}
};




ObjCParser.And_expressionContext = And_expressionContext;

ObjCParser.prototype.and_expression = function() {

    var localctx = new And_expressionContext(this, this._ctx, this.state);
    this.enterRule(localctx, 222, ObjCParser.RULE_and_expression);
    var _la = 0; // Token type
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 1226;
        this.equality_expression();
        this.state = 1231;
        this._errHandler.sync(this);
        _la = this._input.LA(1);
        while(_la===ObjCParser.BITAND) {
            this.state = 1227;
            this.match(ObjCParser.BITAND);
            this.state = 1228;
            this.equality_expression();
            this.state = 1233;
            this._errHandler.sync(this);
            _la = this._input.LA(1);
        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Equality_expressionContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_equality_expression;
    return this;
}

Equality_expressionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Equality_expressionContext.prototype.constructor = Equality_expressionContext;

Equality_expressionContext.prototype.relational_expression = function(i) {
    if(i===undefined) {
        i = null;
    }
    if(i===null) {
        return this.getTypedRuleContexts(Relational_expressionContext);
    } else {
        return this.getTypedRuleContext(Relational_expressionContext,i);
    }
};

Equality_expressionContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterEquality_expression(this);
	}
};

Equality_expressionContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitEquality_expression(this);
	}
};




ObjCParser.Equality_expressionContext = Equality_expressionContext;

ObjCParser.prototype.equality_expression = function() {

    var localctx = new Equality_expressionContext(this, this._ctx, this.state);
    this.enterRule(localctx, 224, ObjCParser.RULE_equality_expression);
    var _la = 0; // Token type
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 1234;
        this.relational_expression();
        this.state = 1239;
        this._errHandler.sync(this);
        _la = this._input.LA(1);
        while(_la===ObjCParser.EQUAL || _la===ObjCParser.NOTEQUAL) {
            this.state = 1235;
            _la = this._input.LA(1);
            if(!(_la===ObjCParser.EQUAL || _la===ObjCParser.NOTEQUAL)) {
            this._errHandler.recoverInline(this);
            }
            else {
                this.consume();
            }
            this.state = 1236;
            this.relational_expression();
            this.state = 1241;
            this._errHandler.sync(this);
            _la = this._input.LA(1);
        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Relational_expressionContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_relational_expression;
    return this;
}

Relational_expressionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Relational_expressionContext.prototype.constructor = Relational_expressionContext;

Relational_expressionContext.prototype.shift_expression = function(i) {
    if(i===undefined) {
        i = null;
    }
    if(i===null) {
        return this.getTypedRuleContexts(Shift_expressionContext);
    } else {
        return this.getTypedRuleContext(Shift_expressionContext,i);
    }
};

Relational_expressionContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterRelational_expression(this);
	}
};

Relational_expressionContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitRelational_expression(this);
	}
};




ObjCParser.Relational_expressionContext = Relational_expressionContext;

ObjCParser.prototype.relational_expression = function() {

    var localctx = new Relational_expressionContext(this, this._ctx, this.state);
    this.enterRule(localctx, 226, ObjCParser.RULE_relational_expression);
    var _la = 0; // Token type
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 1242;
        this.shift_expression();
        this.state = 1247;
        this._errHandler.sync(this);
        _la = this._input.LA(1);
        while(((((_la - 81)) & ~0x1f) == 0 && ((1 << (_la - 81)) & ((1 << (ObjCParser.GT - 81)) | (1 << (ObjCParser.LT - 81)) | (1 << (ObjCParser.LE - 81)) | (1 << (ObjCParser.GE - 81)))) !== 0)) {
            this.state = 1243;
            _la = this._input.LA(1);
            if(!(((((_la - 81)) & ~0x1f) == 0 && ((1 << (_la - 81)) & ((1 << (ObjCParser.GT - 81)) | (1 << (ObjCParser.LT - 81)) | (1 << (ObjCParser.LE - 81)) | (1 << (ObjCParser.GE - 81)))) !== 0))) {
            this._errHandler.recoverInline(this);
            }
            else {
                this.consume();
            }
            this.state = 1244;
            this.shift_expression();
            this.state = 1249;
            this._errHandler.sync(this);
            _la = this._input.LA(1);
        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Shift_expressionContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_shift_expression;
    return this;
}

Shift_expressionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Shift_expressionContext.prototype.constructor = Shift_expressionContext;

Shift_expressionContext.prototype.additive_expression = function(i) {
    if(i===undefined) {
        i = null;
    }
    if(i===null) {
        return this.getTypedRuleContexts(Additive_expressionContext);
    } else {
        return this.getTypedRuleContext(Additive_expressionContext,i);
    }
};

Shift_expressionContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterShift_expression(this);
	}
};

Shift_expressionContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitShift_expression(this);
	}
};




ObjCParser.Shift_expressionContext = Shift_expressionContext;

ObjCParser.prototype.shift_expression = function() {

    var localctx = new Shift_expressionContext(this, this._ctx, this.state);
    this.enterRule(localctx, 228, ObjCParser.RULE_shift_expression);
    var _la = 0; // Token type
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 1250;
        this.additive_expression();
        this.state = 1255;
        this._errHandler.sync(this);
        _la = this._input.LA(1);
        while(_la===ObjCParser.SHIFT_R || _la===ObjCParser.SHIFT_L) {
            this.state = 1251;
            _la = this._input.LA(1);
            if(!(_la===ObjCParser.SHIFT_R || _la===ObjCParser.SHIFT_L)) {
            this._errHandler.recoverInline(this);
            }
            else {
                this.consume();
            }
            this.state = 1252;
            this.additive_expression();
            this.state = 1257;
            this._errHandler.sync(this);
            _la = this._input.LA(1);
        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Additive_expressionContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_additive_expression;
    return this;
}

Additive_expressionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Additive_expressionContext.prototype.constructor = Additive_expressionContext;

Additive_expressionContext.prototype.multiplicative_expression = function(i) {
    if(i===undefined) {
        i = null;
    }
    if(i===null) {
        return this.getTypedRuleContexts(Multiplicative_expressionContext);
    } else {
        return this.getTypedRuleContext(Multiplicative_expressionContext,i);
    }
};

Additive_expressionContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterAdditive_expression(this);
	}
};

Additive_expressionContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitAdditive_expression(this);
	}
};




ObjCParser.Additive_expressionContext = Additive_expressionContext;

ObjCParser.prototype.additive_expression = function() {

    var localctx = new Additive_expressionContext(this, this._ctx, this.state);
    this.enterRule(localctx, 230, ObjCParser.RULE_additive_expression);
    var _la = 0; // Token type
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 1258;
        this.multiplicative_expression();
        this.state = 1263;
        this._errHandler.sync(this);
        _la = this._input.LA(1);
        while(_la===ObjCParser.ADD || _la===ObjCParser.SUB) {
            this.state = 1259;
            _la = this._input.LA(1);
            if(!(_la===ObjCParser.ADD || _la===ObjCParser.SUB)) {
            this._errHandler.recoverInline(this);
            }
            else {
                this.consume();
            }
            this.state = 1260;
            this.multiplicative_expression();
            this.state = 1265;
            this._errHandler.sync(this);
            _la = this._input.LA(1);
        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Multiplicative_expressionContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_multiplicative_expression;
    return this;
}

Multiplicative_expressionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Multiplicative_expressionContext.prototype.constructor = Multiplicative_expressionContext;

Multiplicative_expressionContext.prototype.cast_expression = function(i) {
    if(i===undefined) {
        i = null;
    }
    if(i===null) {
        return this.getTypedRuleContexts(Cast_expressionContext);
    } else {
        return this.getTypedRuleContext(Cast_expressionContext,i);
    }
};

Multiplicative_expressionContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterMultiplicative_expression(this);
	}
};

Multiplicative_expressionContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitMultiplicative_expression(this);
	}
};




ObjCParser.Multiplicative_expressionContext = Multiplicative_expressionContext;

ObjCParser.prototype.multiplicative_expression = function() {

    var localctx = new Multiplicative_expressionContext(this, this._ctx, this.state);
    this.enterRule(localctx, 232, ObjCParser.RULE_multiplicative_expression);
    var _la = 0; // Token type
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 1266;
        this.cast_expression();
        this.state = 1271;
        this._errHandler.sync(this);
        _la = this._input.LA(1);
        while(((((_la - 97)) & ~0x1f) == 0 && ((1 << (_la - 97)) & ((1 << (ObjCParser.MUL - 97)) | (1 << (ObjCParser.DIV - 97)) | (1 << (ObjCParser.MOD - 97)))) !== 0)) {
            this.state = 1267;
            _la = this._input.LA(1);
            if(!(((((_la - 97)) & ~0x1f) == 0 && ((1 << (_la - 97)) & ((1 << (ObjCParser.MUL - 97)) | (1 << (ObjCParser.DIV - 97)) | (1 << (ObjCParser.MOD - 97)))) !== 0))) {
            this._errHandler.recoverInline(this);
            }
            else {
                this.consume();
            }
            this.state = 1268;
            this.cast_expression();
            this.state = 1273;
            this._errHandler.sync(this);
            _la = this._input.LA(1);
        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Cast_expressionContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_cast_expression;
    return this;
}

Cast_expressionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Cast_expressionContext.prototype.constructor = Cast_expressionContext;

Cast_expressionContext.prototype.type_name = function() {
    return this.getTypedRuleContext(Type_nameContext,0);
};

Cast_expressionContext.prototype.cast_expression = function() {
    return this.getTypedRuleContext(Cast_expressionContext,0);
};

Cast_expressionContext.prototype.unary_expression = function() {
    return this.getTypedRuleContext(Unary_expressionContext,0);
};

Cast_expressionContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterCast_expression(this);
	}
};

Cast_expressionContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitCast_expression(this);
	}
};




ObjCParser.Cast_expressionContext = Cast_expressionContext;

ObjCParser.prototype.cast_expression = function() {

    var localctx = new Cast_expressionContext(this, this._ctx, this.state);
    this.enterRule(localctx, 234, ObjCParser.RULE_cast_expression);
    try {
        this.state = 1280;
        var la_ = this._interp.adaptivePredict(this._input,145,this._ctx);
        switch(la_) {
        case 1:
            this.enterOuterAlt(localctx, 1);
            this.state = 1274;
            this.match(ObjCParser.LPAREN);
            this.state = 1275;
            this.type_name();
            this.state = 1276;
            this.match(ObjCParser.RPAREN);
            this.state = 1277;
            this.cast_expression();
            break;

        case 2:
            this.enterOuterAlt(localctx, 2);
            this.state = 1279;
            this.unary_expression();
            break;

        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Unary_expressionContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_unary_expression;
    return this;
}

Unary_expressionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Unary_expressionContext.prototype.constructor = Unary_expressionContext;

Unary_expressionContext.prototype.postfix_expression = function() {
    return this.getTypedRuleContext(Postfix_expressionContext,0);
};

Unary_expressionContext.prototype.unary_expression = function() {
    return this.getTypedRuleContext(Unary_expressionContext,0);
};

Unary_expressionContext.prototype.unary_operator = function() {
    return this.getTypedRuleContext(Unary_operatorContext,0);
};

Unary_expressionContext.prototype.cast_expression = function() {
    return this.getTypedRuleContext(Cast_expressionContext,0);
};

Unary_expressionContext.prototype.type_name = function() {
    return this.getTypedRuleContext(Type_nameContext,0);
};

Unary_expressionContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterUnary_expression(this);
	}
};

Unary_expressionContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitUnary_expression(this);
	}
};




ObjCParser.Unary_expressionContext = Unary_expressionContext;

ObjCParser.prototype.unary_expression = function() {

    var localctx = new Unary_expressionContext(this, this._ctx, this.state);
    this.enterRule(localctx, 236, ObjCParser.RULE_unary_expression);
    try {
        this.state = 1298;
        switch(this._input.LA(1)) {
        case ObjCParser.ENCODE:
        case ObjCParser.PROTOCOL:
        case ObjCParser.SELECTOR:
        case ObjCParser.SUPER:
        case ObjCParser.SELF:
        case ObjCParser.LPAREN:
        case ObjCParser.LBRACK:
        case ObjCParser.AT:
        case ObjCParser.CARET:
        case ObjCParser.IDENTIFIER:
        case ObjCParser.CHARACTER_LITERAL:
        case ObjCParser.STRING_LITERAL:
        case ObjCParser.HEX_LITERAL:
        case ObjCParser.DECIMAL_LITERAL:
        case ObjCParser.OCTAL_LITERAL:
        case ObjCParser.FLOATING_POINT_LITERAL:
            this.enterOuterAlt(localctx, 1);
            this.state = 1282;
            this.postfix_expression();
            break;
        case ObjCParser.INC:
            this.enterOuterAlt(localctx, 2);
            this.state = 1283;
            this.match(ObjCParser.INC);
            this.state = 1284;
            this.unary_expression();
            break;
        case ObjCParser.DEC:
            this.enterOuterAlt(localctx, 3);
            this.state = 1285;
            this.match(ObjCParser.DEC);
            this.state = 1286;
            this.unary_expression();
            break;
        case ObjCParser.BANG:
        case ObjCParser.TILDE:
        case ObjCParser.SUB:
        case ObjCParser.MUL:
        case ObjCParser.BITAND:
            this.enterOuterAlt(localctx, 4);
            this.state = 1287;
            this.unary_operator();
            this.state = 1288;
            this.cast_expression();
            break;
        case ObjCParser.SIZEOF:
            this.enterOuterAlt(localctx, 5);
            this.state = 1290;
            this.match(ObjCParser.SIZEOF);
            this.state = 1296;
            var la_ = this._interp.adaptivePredict(this._input,146,this._ctx);
            switch(la_) {
            case 1:
                this.state = 1291;
                this.match(ObjCParser.LPAREN);
                this.state = 1292;
                this.type_name();
                this.state = 1293;
                this.match(ObjCParser.RPAREN);
                break;

            case 2:
                this.state = 1295;
                this.unary_expression();
                break;

            }
            break;
        default:
            throw new antlr4.error.NoViableAltException(this);
        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Unary_operatorContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_unary_operator;
    return this;
}

Unary_operatorContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Unary_operatorContext.prototype.constructor = Unary_operatorContext;


Unary_operatorContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterUnary_operator(this);
	}
};

Unary_operatorContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitUnary_operator(this);
	}
};




ObjCParser.Unary_operatorContext = Unary_operatorContext;

ObjCParser.prototype.unary_operator = function() {

    var localctx = new Unary_operatorContext(this, this._ctx, this.state);
    this.enterRule(localctx, 238, ObjCParser.RULE_unary_operator);
    var _la = 0; // Token type
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 1300;
        _la = this._input.LA(1);
        if(!(((((_la - 83)) & ~0x1f) == 0 && ((1 << (_la - 83)) & ((1 << (ObjCParser.BANG - 83)) | (1 << (ObjCParser.TILDE - 83)) | (1 << (ObjCParser.SUB - 83)) | (1 << (ObjCParser.MUL - 83)) | (1 << (ObjCParser.BITAND - 83)))) !== 0))) {
        this._errHandler.recoverInline(this);
        }
        else {
            this.consume();
        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Postfix_expressionContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_postfix_expression;
    return this;
}

Postfix_expressionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Postfix_expressionContext.prototype.constructor = Postfix_expressionContext;

Postfix_expressionContext.prototype.primary_expression = function() {
    return this.getTypedRuleContext(Primary_expressionContext,0);
};

Postfix_expressionContext.prototype.expression = function(i) {
    if(i===undefined) {
        i = null;
    }
    if(i===null) {
        return this.getTypedRuleContexts(ExpressionContext);
    } else {
        return this.getTypedRuleContext(ExpressionContext,i);
    }
};

Postfix_expressionContext.prototype.identifier = function(i) {
    if(i===undefined) {
        i = null;
    }
    if(i===null) {
        return this.getTypedRuleContexts(IdentifierContext);
    } else {
        return this.getTypedRuleContext(IdentifierContext,i);
    }
};

Postfix_expressionContext.prototype.argument_expression_list = function(i) {
    if(i===undefined) {
        i = null;
    }
    if(i===null) {
        return this.getTypedRuleContexts(Argument_expression_listContext);
    } else {
        return this.getTypedRuleContext(Argument_expression_listContext,i);
    }
};

Postfix_expressionContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterPostfix_expression(this);
	}
};

Postfix_expressionContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitPostfix_expression(this);
	}
};




ObjCParser.Postfix_expressionContext = Postfix_expressionContext;

ObjCParser.prototype.postfix_expression = function() {

    var localctx = new Postfix_expressionContext(this, this._ctx, this.state);
    this.enterRule(localctx, 240, ObjCParser.RULE_postfix_expression);
    var _la = 0; // Token type
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 1302;
        this.primary_expression();
        this.state = 1320;
        this._errHandler.sync(this);
        _la = this._input.LA(1);
        while(((((_la - 69)) & ~0x1f) == 0 && ((1 << (_la - 69)) & ((1 << (ObjCParser.LPAREN - 69)) | (1 << (ObjCParser.LBRACK - 69)) | (1 << (ObjCParser.DOT - 69)) | (1 << (ObjCParser.STRUCTACCESS - 69)) | (1 << (ObjCParser.INC - 69)) | (1 << (ObjCParser.DEC - 69)))) !== 0)) {
            this.state = 1318;
            switch(this._input.LA(1)) {
            case ObjCParser.LBRACK:
                this.state = 1303;
                this.match(ObjCParser.LBRACK);
                this.state = 1304;
                this.expression();
                this.state = 1305;
                this.match(ObjCParser.RBRACK);
                break;
            case ObjCParser.LPAREN:
                this.state = 1307;
                this.match(ObjCParser.LPAREN);
                this.state = 1309;
                _la = this._input.LA(1);
                if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << ObjCParser.ENCODE) | (1 << ObjCParser.PROTOCOL) | (1 << ObjCParser.SELECTOR) | (1 << ObjCParser.SUPER) | (1 << ObjCParser.SELF))) !== 0) || ((((_la - 55)) & ~0x1f) == 0 && ((1 << (_la - 55)) & ((1 << (ObjCParser.SIZEOF - 55)) | (1 << (ObjCParser.LPAREN - 55)) | (1 << (ObjCParser.LBRACK - 55)) | (1 << (ObjCParser.AT - 55)) | (1 << (ObjCParser.BANG - 55)) | (1 << (ObjCParser.TILDE - 55)))) !== 0) || ((((_la - 93)) & ~0x1f) == 0 && ((1 << (_la - 93)) & ((1 << (ObjCParser.INC - 93)) | (1 << (ObjCParser.DEC - 93)) | (1 << (ObjCParser.SUB - 93)) | (1 << (ObjCParser.MUL - 93)) | (1 << (ObjCParser.BITAND - 93)) | (1 << (ObjCParser.CARET - 93)))) !== 0) || ((((_la - 125)) & ~0x1f) == 0 && ((1 << (_la - 125)) & ((1 << (ObjCParser.IDENTIFIER - 125)) | (1 << (ObjCParser.CHARACTER_LITERAL - 125)) | (1 << (ObjCParser.STRING_LITERAL - 125)) | (1 << (ObjCParser.HEX_LITERAL - 125)) | (1 << (ObjCParser.DECIMAL_LITERAL - 125)) | (1 << (ObjCParser.OCTAL_LITERAL - 125)) | (1 << (ObjCParser.FLOATING_POINT_LITERAL - 125)))) !== 0)) {
                    this.state = 1308;
                    this.argument_expression_list();
                }

                this.state = 1311;
                this.match(ObjCParser.RPAREN);
                break;
            case ObjCParser.DOT:
                this.state = 1312;
                this.match(ObjCParser.DOT);
                this.state = 1313;
                this.identifier();
                break;
            case ObjCParser.STRUCTACCESS:
                this.state = 1314;
                this.match(ObjCParser.STRUCTACCESS);
                this.state = 1315;
                this.identifier();
                break;
            case ObjCParser.INC:
                this.state = 1316;
                this.match(ObjCParser.INC);
                break;
            case ObjCParser.DEC:
                this.state = 1317;
                this.match(ObjCParser.DEC);
                break;
            default:
                throw new antlr4.error.NoViableAltException(this);
            }
            this.state = 1322;
            this._errHandler.sync(this);
            _la = this._input.LA(1);
        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function Argument_expression_listContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_argument_expression_list;
    return this;
}

Argument_expression_listContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
Argument_expression_listContext.prototype.constructor = Argument_expression_listContext;

Argument_expression_listContext.prototype.assignment_expression = function(i) {
    if(i===undefined) {
        i = null;
    }
    if(i===null) {
        return this.getTypedRuleContexts(Assignment_expressionContext);
    } else {
        return this.getTypedRuleContext(Assignment_expressionContext,i);
    }
};

Argument_expression_listContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterArgument_expression_list(this);
	}
};

Argument_expression_listContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitArgument_expression_list(this);
	}
};




ObjCParser.Argument_expression_listContext = Argument_expression_listContext;

ObjCParser.prototype.argument_expression_list = function() {

    var localctx = new Argument_expression_listContext(this, this._ctx, this.state);
    this.enterRule(localctx, 242, ObjCParser.RULE_argument_expression_list);
    var _la = 0; // Token type
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 1323;
        this.assignment_expression();
        this.state = 1328;
        this._errHandler.sync(this);
        _la = this._input.LA(1);
        while(_la===ObjCParser.COMMA) {
            this.state = 1324;
            this.match(ObjCParser.COMMA);
            this.state = 1325;
            this.assignment_expression();
            this.state = 1330;
            this._errHandler.sync(this);
            _la = this._input.LA(1);
        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function IdentifierContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_identifier;
    return this;
}

IdentifierContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
IdentifierContext.prototype.constructor = IdentifierContext;

IdentifierContext.prototype.IDENTIFIER = function() {
    return this.getToken(ObjCParser.IDENTIFIER, 0);
};

IdentifierContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterIdentifier(this);
	}
};

IdentifierContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitIdentifier(this);
	}
};




ObjCParser.IdentifierContext = IdentifierContext;

ObjCParser.prototype.identifier = function() {

    var localctx = new IdentifierContext(this, this._ctx, this.state);
    this.enterRule(localctx, 244, ObjCParser.RULE_identifier);
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 1331;
        this.match(ObjCParser.IDENTIFIER);
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};

function ConstantContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = ObjCParser.RULE_constant;
    return this;
}

ConstantContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
ConstantContext.prototype.constructor = ConstantContext;

ConstantContext.prototype.DECIMAL_LITERAL = function() {
    return this.getToken(ObjCParser.DECIMAL_LITERAL, 0);
};

ConstantContext.prototype.HEX_LITERAL = function() {
    return this.getToken(ObjCParser.HEX_LITERAL, 0);
};

ConstantContext.prototype.OCTAL_LITERAL = function() {
    return this.getToken(ObjCParser.OCTAL_LITERAL, 0);
};

ConstantContext.prototype.CHARACTER_LITERAL = function() {
    return this.getToken(ObjCParser.CHARACTER_LITERAL, 0);
};

ConstantContext.prototype.FLOATING_POINT_LITERAL = function() {
    return this.getToken(ObjCParser.FLOATING_POINT_LITERAL, 0);
};

ConstantContext.prototype.enterRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.enterConstant(this);
	}
};

ConstantContext.prototype.exitRule = function(listener) {
    if(listener instanceof ObjCListener ) {
        listener.exitConstant(this);
	}
};




ObjCParser.ConstantContext = ConstantContext;

ObjCParser.prototype.constant = function() {

    var localctx = new ConstantContext(this, this._ctx, this.state);
    this.enterRule(localctx, 246, ObjCParser.RULE_constant);
    var _la = 0; // Token type
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 1333;
        _la = this._input.LA(1);
        if(!(((((_la - 126)) & ~0x1f) == 0 && ((1 << (_la - 126)) & ((1 << (ObjCParser.CHARACTER_LITERAL - 126)) | (1 << (ObjCParser.HEX_LITERAL - 126)) | (1 << (ObjCParser.DECIMAL_LITERAL - 126)) | (1 << (ObjCParser.OCTAL_LITERAL - 126)) | (1 << (ObjCParser.FLOATING_POINT_LITERAL - 126)))) !== 0))) {
        this._errHandler.recoverInline(this);
        }
        else {
            this.consume();
        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};


exports.ObjCParser = ObjCParser;
